尝试了解基于Qt / QML的应用程序的最佳实践,我们将方法标记为Q_INVOKABLE
。如果我们从这些方法之一中抛出异常会有什么后果?
class Class
{
...
Q_INVOKABLE void method() { throw std::logic_error(); }
};
QML可以处理此错误,还是会导致程序崩溃?
答案 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。