C++ 从Q_可调用方法引发异常?

C++ 从Q_可调用方法引发异常?,c++,qt,exception-handling,qml,C++,Qt,Exception Handling,Qml,试图了解基于Qt/QML的应用程序的最佳实践,其中我们将方法标记为Q\u INVOKABLE。如果我们从这些方法中抛出异常,会产生什么后果 class Class { ... Q_INVOKABLE void method() { throw std::logic_error(); } }; QML能处理这个错误吗,或者我会使程序崩溃吗?宏只会标记函数,以便使用QMetaObject::invokeMethod()调用它。它并没有真正改变Qt中处理异常的方式 为此,区分通过连接

试图了解基于Qt/QML的应用程序的最佳实践,其中我们将方法标记为
Q\u INVOKABLE
。如果我们从这些方法中抛出异常,会产生什么后果

class Class
{
    ...
    Q_INVOKABLE void method() { throw std::logic_error(); }
};

QML能处理这个错误吗,或者我会使程序崩溃吗?

宏只会标记函数,以便使用
QMetaObject::invokeMethod()
调用它。它并没有真正改变Qt中处理异常的方式

为此,区分通过连接调用的插槽和作为正常函数直接调用的插槽非常重要。如果通过信号插槽连接调用方法,则抛出异常时发生的情况未定义,除非您实际在插槽中处理异常。即,在插槽中,您必须写入:

try {
    obj.method();
catch (std::logic_error &err) {
    // error-handling
}
不能忽略
catch()
语句

另一方面,如果该方法是作为函数直接调用的,那么裸抛出就可以了。但是,无论在哪里调用该方法,都必须捕获并处理它。也就是说,你必须写:

try {
    obj.method();
catch (std::logic_error &err) {
    // error-handling
}

这实际上是因为Qt应用程序事件循环中的错误处理没有得到很好的定义。有关更多信息,请参阅。

我同意您关于其工作原理的回答。也就是说,我不认为实现一个做了一些工作的函数有什么意义,然后在某个时刻抛出并捕获函数本身中的异常。在这种情况下,如果用标准来处理错误的情况,那么,似乎其他的东西更有意义。那么,如果我们在行之间读取——如果我们调用从抛出异常的QML中的C++方法,行为是未定义的?@ SooWoots是一个常见的例子,它是一个与一些外部库接口的槽,它会引发异常。Qt本身(几乎)从未在标准版本中抛出异常,但许多第三方库大量使用异常。@yano是的,这似乎是对的。所有异常处理都应该在C++类内部完成,如果你从QML调用它们。