为什么Qt不使用异常处理?

Roh*_*bhu 65 qt

我一直想知道,由于Qt几乎使用了标准中的所有C++特性,并且以一种奇妙和创新的方式,并且每当它不使用特定功能时,它都有一个完全有效和适用的原因.在这种情况下,为什么没有Qt类使用throw关键字和throw任何例外?他们try ... catch在我们的Qt编写代码中不需要阻塞的原因是什么?

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

Fra*_*eld 66

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

"当Qt启动时,Qt需要支持的所有编译器都没有例外.今天我们正在尝试保持API一致,因此具有不使用异常历史的模块通常不会使用添加的异常获取新代码你会注意到Qt的一些新模块中使用了异常."

我认为这总结了很多.

  • 我想是时候适应新时代了.历史原因不能阻止我们使用这么好的功能. (3认同)
  • 来自Qt官方[文档](http://doc.qt.io/)的另一个[原因](http://doc.qt.io/qt-5.5/exceptionsafety.html):*Qt本身不会抛出异常.而是使用错误代码.此外,某些类具有用户可见的错误消息,例如[QIODevice :: errorString](http://doc.qt.io/qt-5/qiodevice.html#errorString)()或[QSqlQuery :: lastError]( http://doc.qt.io/qt-5/qsqlquery.html#lastError)().`这有历史和实际原因 - 启用例外可以将库大小增加20%以上. (3认同)

hmu*_*ner 11

如果你谷歌搜索"qt例外",你会得到很多关于这个主题的讨论. 是一个"官方"答案:

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

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

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


jil*_*wit 6

你可以在KDE devel邮件列表上阅读关于例外的一个很好的,大多是文明的辩论.由于KDE和QT是相关的,我假设同样的问题适用,(如果我正确读取线程)可以概括为:

  • 异常具有性能问题,具体取决于编译器.
  • 屏蔽图书馆用户免于使用例外的义务(不将其从图书馆中丢弃)
  • 围绕C++中的异常规范的问题

  • 什么性能问题?Bjarne似乎在他的新书中写道,如果它们没有出现,它几乎是无操作的,如果它们这样做,它最大化函数调用开销?另外,规范中有哪些问题?我不明白屏蔽部分.你能详细说说吗? (2认同)