qt中的全局try and catch块

Posted

技术标签:

【中文标题】qt中的全局try and catch块【英文标题】:global try and catch block in qt 【发布时间】:2016-12-29 04:45:19 【问题描述】:

我使用的是 Qt 4.8。有没有办法为整个项目设置一个全局的 try 和 catch 块。例如,如果我的应用程序有两个 .cpp 文件。是否有可能在两个 .cpp 文件中捕获异常?

【问题讨论】:

【参考方案1】:

首先,请注意 Qt 不能很好地处理异常。它是在 C++ 中异常是相当晦涩的特性时设计的,因此由于一大堆与实现相关的原因,通常不认为使用异常是一种好的做法。

另外请注意,从 Qt 5.7 开始,异常安全功能并不完整,正如官方 doc 目前所说:

初步警告:异常安全功能不完整!常见情况应该可以工作,但类可能仍会泄漏甚至崩溃。

如果您在类中使用信号槽连接,最好在槽内处理可能抛出异常的异常。从 Qt 5.7 开始,不这样做是 considered 未定义的行为。

如果您只是想对任何偶尔未捕获的异常进行一些清理和/或错误记录,您可以按照前面的答案将整个 main() 内容包装到 try/catch 块中,或者您可以将 wrap the Qt's main event loop 放入这样的块:

QApplication app(argc, argv);
...
try 
    app.exec();

catch (const std::exception &) 
    // clean up here, e.g. save the session
    // and close all config files.

    return 0; // exit the application

【讨论】:

【参考方案2】:

您可以将main() 函数的全部内容放在括号中,如下所示::

int main(int argc, char *argv[])

    int ret = 0;

    try    
    
        QApplication a(argc, argv);

        QWidget w;
        w.show();

        ret = a.exec();
    
    catch(...)
    
        /* ... */
    

    return ret;

另请参阅:std::set_terminate()

【讨论】:

以上是关于qt中的全局try and catch块的主要内容,如果未能解决你的问题,请参考以下文章

Nodejs:catch块中的回调函数在try-catch中返回未定义的参数

Try-Catch-Finally代码块中的return

单个 Try Catch 块中的多个 JDBC 语句。是好习惯吗?

react-native 无法处理 try catch 块中的错误

Java中的异常处理try catch(第八周课堂示例总结)

如何使用多个catch块处理异常