繁体   English   中英

从Q_INVOKABLE方法引发异常?

[英]Throwing an exception from Q_INVOKABLE method?

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

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

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

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应用程序事件循环中的错误处理未明确定义。 有关更多信息,请参见Qt 5.9上文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM