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

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

【问题讨论】:

    标签: windows qt visual-c++


    【解决方案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()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-02
        • 2013-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多