从Q_INVOKABLE方法抛出异常?

时间:2017-11-17 01:26:48

标签: c++ qt exception-handling qml

尝试了解基于Qt / QML的应用程序的最佳实践,我们将方法标记为Q_INVOKABLE。如果我们从这些方法之一中抛出异常会有什么后果?

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

QML可以处理此错误,还是会导致程序崩溃?

1 个答案:

答案 0 :(得分:2)

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

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

void Class::method() {
    try {
        // code that might throw logic_error
    } catch (std::logic_error &err) {
    }
}

您不能省略catch()声明。

另一方面,如果直接将该方法作为函数调用,那么裸投就可以了。但是,必须在调用方法的任何地方捕获和处理它。即,你必须写:

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

这完全是因为Qt应用程序事件循环中的错误处理没有明确定义。有关详细信息,请参阅docs on Qt 5.9