【问题标题】:Why doesn't Qt use exception handling?Qt 为什么不使用异常处理?
【发布时间】:2011-07-29 18:27:38
【问题描述】:

我一直想知道,既然 Qt 以一种奇妙而创新的方式使用了标准中的几乎所有 C++ 特性,并且每当它不使用特定特性时,它有一个完全有效且适用的理由不这样做.在那种情况下,为什么没有 Qt 类使用 throw 关键字和 throw 任何异常?在我们的 Qt 编写代码中从不要求 try ... catch 块的理由是什么?

就个人而言,我自己不太喜欢它,并且无论我是否使用 Qt 并且总是使用错误代码和返回值而不是抛出异常对象,都从不使用它。但是为什么我在他们的文档中没有看到 QException 类? Qt 开发者对此有何看法?

【问题讨论】:

  • 附带说明 new 在大多数情况下会抛出 std::bad_alloc 所以如果你想编写坚固的代码就不要太舒服。

标签: qt


【解决方案1】:

主要是出于历史原因。编译器中的异常支持需要相当长的时间才能成熟。引用诺基亚的Tobias Hunger

“当 Qt 启动时,Qt 需要支持的所有编译器都无法使用异常。今天我们正在努力保持 API 的一致性,因此具有不使用异常历史的模块通常不会获得新代码使用添加的异常。 您会注意到 Qt 的一些新模块中使用了异常。”

我认为这总结得差不多了。

【讨论】:

  • 我想是时候适应新时代了。历史原因不能阻止我们使用这么好的功能。
  • 来自Qt官方documentation的另外一个reasonQt本身不会抛出异常。而是使用错误代码。此外,某些类具有用户可见的错误消息,例如QIODevice::errorString() 或QSqlQuery::lastError()。 This has historical and practical reasons - turning on exceptions can increase the library size by over 20%.
【解决方案2】:

如果你在谷歌上搜索“qt exceptions”,你会得到很多关于这个话题的讨论。 Here 是“官方”回答:

Qt 启动时,并非所有需要 Qt 支持的编译器都可以使用异常。今天,我们正在努力保持 API 的一致性,因此具有不使用异常历史记录的模块通常不会使用添加的异常获得新代码。

您会注意到 Qt 的一些新模块中使用了异常。

如果您在助手索引中查找异常(即在 Qt 文档中),您会发现一些异常类,例如QtConcurrent::Exception。

【讨论】:

    【解决方案3】:

    您可以阅读关于例外情况的精彩的、主要是文明的辩论here on the KDE devel mailinglist。由于 KDE 和 QT 是相关的,我假设同样的问题也适用,(如果我正确阅读线程)可以总结为:

    • 异常存在性能问题,具体取决于编译器。
    • 使库的用户免于使用异常的义务(通过不将它们从库中抛出)
    • 围绕 C++ 中异常规范的问题

    【讨论】:

    • 什么性能问题? Bjarne 似乎在他的新书中写道,如果它们没有发生,它几乎是无操作的,如果它们发生了,那么函数调用开销最大吗?另外,规范中有什么问题?我不明白屏蔽部分。你能详细说明一下吗?
    • 嗨@LaszloPapp,如果您阅读我链接的主题,我的观点就会变得清晰。否则,我认为两个评分较高的答案可能比我的更准确。
    • @Ipapp : Bjarne 不知道所有实现问题... MinGW(GCC 的 windows 端口)在启用异常(即使没有在代码中使用它们)时性能大幅下降(25%)几年前。现在基本解决了,但很明显异常问题已经有一段时间了,即使主流编译器(linux下的gcc,msvc...)都没有问题。
    猜你喜欢
    • 2010-12-16
    • 2020-01-19
    • 2021-11-12
    • 1970-01-01
    • 2011-03-14
    • 2011-05-08
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多