【问题标题】:Qt and error handling strategyQt和错误处理策略
【发布时间】:2010-12-07 09:24:56
【问题描述】:

实际上,我确实了解使用异常的主要优点和缺点。我默认在我的项目中使用它们作为错误处理策略。 但是现在我正在使用 Qt 库启动一个 Windows CE 项目,并且我看到 Qt 创建者拒绝在类层次结构中使用异常。

所以,如果我使用异常,我需要在我的/Qt 代码边界上小心地将它们转换为错误代码(或某些对象,或者只是吞下)。否则,我可以拒绝在我的代码中使用异常并切换到其他策略。

在我的情况下,最好的错误处理策略是什么 - 使用异常或使用错误代码等等......? 你有 Qt 开发经验吗?你使用了什么错误处理策略?

【问题讨论】:

    标签: c++ qt exception


    【解决方案1】:

    重写 QApplication::notify() 并在那里处理异常(不是 100% 的返回值)。您可以从信号处理程序中“抛出”异常,但它们不会以这种方式传播到 Qt。

    bool
    notify(QObject * rec, QEvent * ev)
    {
      try
      {
        return QApplication::notify(rec,ev);
      }
      catch(my::Exception & e)
      {
        QMessageBox::warning(0,
                             tr("An error occurred"),
                             e.message());
      }
      catch(...)
      {
        QMessageBox::warning(0,
                             tr("An unexpected error occurred"),
                             tr("This is likely a bug."));
      }
      return false;
    

    【讨论】:

    • 所以,这个方法将允许我们从事件处理程序中抛出异常。但是插槽(直接连接和排队连接)呢?
    • 请不要从插槽中抛出 - 除非您确保 QMetaObject::activate 是异常安全的(它不在 4.8.2 中)但已在稍后的 4.8 中修复
    • 是的,您可以从这样的事件处理程序中捕获错误异常,但是此解决方案是否暗示 OP 应将 QT 的错误代码重新解释为异常并使用上述方法捕获它们?我认为@AlexChe 是在寻求有关整体错误处理策略的建议?
    【解决方案2】:

    Qt 不支持从事件处理程序中抛出异常。避免这种情况,异常应该没有任何问题。

    【讨论】:

    • cheez 说它实际上受支持吗?
    • 不,不支持。只是您可以自行承担使用它们的风险。
    猜你喜欢
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 2011-02-28
    • 1970-01-01
    相关资源
    最近更新 更多