不允许 C++ 异常

Posted

技术标签:

【中文标题】不允许 C++ 异常【英文标题】:C++ Exceptions not allowed 【发布时间】:2016-06-30 06:40:19 【问题描述】:

有什么理由不在 gcc 中使用 C++ 异常?

我们公司不允许他们这样做,但没有提供决定背后的理由。我们这些“愚蠢的人”都想不出任何理由。有什么建议吗?

【问题讨论】:

在不确切知道您正在开发什么样的软件的情况下,很难说。不过,这听起来确实过于教条。也许是时候换工作了? 既然你用qt标记了这个,它可能与Qt不依赖异常而只是效仿有关。 感谢您的众多回答。这些应用程序是普通的桌面应用程序,既不重要也不实时。 【参考方案1】:

只是猜测一些原因:

许多规则已经很老了,并且是在不再成立的假设/条件下定义的。早期的异常实现有严重的性能缺陷,例如一些编译器完全禁用优化。这是过时的,今天的异常在不抛出时是零开销。投掷比必须做一些工作,因此不是免费的。不幸的是,更改规则通常非常耗时,因为它们是某些 QA 流程的一部分。

嵌入式程序员通常不允许异常。首先,异常给 RTTI 带来了一些大小开销,这在嵌入式代码中也经常被禁止。其次,异常使得实时性能难以推理,因为性能难以预测。

Google 的编码风格没有例外规则。这里的论点是旧代码不是异常安全的,例如没有 RAII 课程。如果您在此类遗留代码中引入异常,则很可能会出现问题。但是,我强烈认为应该修复旧代码。

【讨论】:

【参考方案2】:

这篇文章很好地列出了关于 C++ 中异常使用的论点和反论点(关于神话)。

Why use exceptions?

【讨论】:

所有提供的答案都很好,我选择了这个,因为链接是关于异常的官方常见问题解答,作者的分数最少。【参考方案3】:

有一些相当大的应用领域通常禁止异常。嵌入式系统、主机游戏,很少使用异常,因为平台可能支持有限或不支持。

Bjarne Stroustrup 帮助编写了 JSF 飞行器编码标准,该标准也禁止 C++ 异常。

http://www.stroustrup.com/JSF-AV-rules.pdf

原因在于,在响应速度对生命至关重要的情况下,异常可能会使代码变慢,以至于使用它们存在不合理的风险。或者,让推理代码的速度变得更加困难。

【讨论】:

【参考方案4】:

C++ 异常实现有以下缺点:容易发生内存泄漏、缺少调用堆栈、在析构函数中抛出抛出时崩溃、“noexcept”的复杂性。 当项目中采用异常时,很容易造成内存泄漏。由于您不知道会抛出哪种方法,因此在内存管理和调整所有代码库时必须非常谨慎。这就是我在 C#、Java 和 Python 项目中使用异常而不在 C++ 中使用异常的原因。 ​

许多 C++ 库和框架也不使用异常(例如 Qt)

【讨论】:

以上是关于不允许 C++ 异常的主要内容,如果未能解决你的问题,请参考以下文章

C++中的异常处理

为啥不抛出异常的代码允许捕获已检查的异常?

C++ Primer 5th笔记(chap 18 大型程序工具)异常处理

C++ 浅析异常

[C++]异常处理,你不会不清楚吧

当您的方法签名不允许抛出异常时如何抛出异常?