gpt4 book ai didi

c++ - 从 Q_INVOKABLE 方法中抛出异常?

转载 作者:行者123 更新时间:2023-11-30 03:27:27 27 4
gpt4 key购买 nike

试图了解基于 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 应用程序事件循环中的错误处理没有明确定义。查看docs on Qt 5.9获取更多信息。

关于c++ - 从 Q_INVOKABLE 方法中抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47341890/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com