不使用C++;设计异常,以llvm/clang为单位 LLVM/CLAN被认为是良好的C++代码库。我想知道为什么C++异常根本不用于它们?

不使用C++;设计异常,以llvm/clang为单位 LLVM/CLAN被认为是良好的C++代码库。我想知道为什么C++异常根本不用于它们?,c++,exception,coding-style,llvm,clang,C++,Exception,Coding Style,Llvm,Clang,内存是使用池之类的东西来管理的,错误是用C中的返回值和代码来报告的。它们甚至将运算符new包装为placement new,在没有内存时返回错误而不是异常 你知道为什么LLVM哲学在大多数书籍推荐使用它们时不使用C++异常吗?p> 大多数书籍都推荐使用它们吗?我知道大多数C++编程书籍都是因为它们是语言的一部分,但我认为我没有看过一本书,他们认为它们更喜欢错误代码或其他错误处理方法。事实上,我想说的是,大多数书籍都不建议使用异常,因为它们没有介绍如何编写好的异常安全代码 就LLVM是好代码和不是

内存是使用池之类的东西来管理的,错误是用C中的返回值和代码来报告的。它们甚至将运算符new包装为placement new,在没有内存时返回错误而不是异常


你知道为什么LLVM哲学在大多数书籍推荐使用它们时不使用C++异常吗?p> 大多数书籍都推荐使用它们吗?我知道大多数C++编程书籍都是因为它们是语言的一部分,但我认为我没有看过一本书,他们认为它们更喜欢错误代码或其他错误处理方法。事实上,我想说的是,大多数书籍都不建议使用异常,因为它们没有介绍如何编写好的异常安全代码


就LLVM是好代码和不是基于异常的代码而言,这两个概念基本上是正交的。代码可以写得干净利落,有例外也可以没有例外

似乎避免例外并不是llvm的理念。至少我在编码标准中没有发现任何异常(http://llvm.org/docs/CodingStandards.html),所以这取决于开发人员


为什么它没有被广泛使用?到目前为止,AFAIK异常支持还没有在llvm中实现,因此无法为llvm本身编译llvm:)。因此,避免异常是一个历史原因。

编写异常安全的C++代码是一项艰巨的任务。 关闭异常可能会导致错误


也许这是相关的。

我认为这源于另一条准则:

  • 使用错误代码处理正常错误情况
  • 异常错误情况通过
    assert
    处理

我想说的是,
assert
是一个更难的例外:你绝对不能忽视它;)

Chris Lattner最近在LLVM项目中澄清了这个问题


不使用异常和RTTI可以减少可执行文件的大小并减少开销。(您可能会争辩说,除非抛出零成本异常,否则没有开销。至少,它们实际上会将代码分解为更小的基本块,并抑制某些类型的代码运动。)

取决于您的编译器和代码,使用异常的程序可以比禁用和不使用异常的等效程序更快或更慢。另外,使用异常的可能更大或更小

每个错误处理策略都会带来一些成本,我希望LLVM开发人员考虑了他们的情况,发现禁用异常是LLVM更好的决策


我的建议,也是我从专家那里看到最多的建议,是使用异常来报告失败,除非您有明确的理由不这样做。如果您的原因是性能问题,那么明智的做法是将您的选择建立在分析的基础上。请记住,比较使用异常的代码和不使用异常但仍能正确处理错误的代码是至关重要的。

检查问题。这可能会有帮助。RAII与异常有什么关系?@Kirill:这有什么关系?我不要求将异常用作流控制,而是将它们用于它们的意图-erros@zaharpopov,这在一定程度上与“抛出代码效率很低”有关。@Kirill:这不是关于.NET吗?我在某处读到,C++的投掷成本就像函数调用。此外,由于不再讨论使用异常作为控制流,而只在特殊情况下,效率较低,更有效的C++建议在类C返回代码上更喜欢异常,因为异常不能被忽略,读“C++编程语言”,大多数C++书籍不包括异常安全性。大多数C++书籍不值得阅读也是如此。值得阅读的几个例子都涉及到异常安全性,因为编写正确的C++代码时,它是非常重要的。“史提夫M我有,我有。这并没有改变一个事实,即大多数教授一种语言的编程书籍都涉及语法,没有正确使用,甚至没有安全使用。当然,偶尔会有一本书,超出了K.& R,C++编程语言,但看看它们是如何被说成是神秘的。俗话说,异常证明了规则。@smerlin:
assert
不能代替异常,因为
assert
在被触发后无法“处理”。异常是设计用来处理的。哲学与否据我所知,LLVM中绝对没有使用异常,也许他们只是不想使用?:)你可以在LLVM邮件中请求正确的C++代码,它也不例外,比写异常安全代码要困难得多(至少基本异常安全)。@ RoToLUP:谷歌C++指南禁止异常,这是事实。但这也解释了他们认为这不再是一个好的决定,只是因为他们需要自由地与自己的遗留代码进行互操作而被迫做出的决定。@Clayton:人类是荣耀的类人猿吗?他们两人之间的差异太大,不足以证明一个恰当的回答是正确的…@comonad:你完全错了<代码>转到允许任意流(向上、向下…),而异常只允许“向下”,即到下一个可能处理它们的catch块。并保证了堆栈的展开。此外,因为我们在谈论C++,所以没有最后的块。编写具有基本异常安全性的代码很容易,大学里没有教它,许多人不知道它是什么,但无知和困难是两个正交的概念。我同意编写强大的异常安全代码比较困难,但用另一种机制提供相同的保证并不困难…@ClaytonHughes exception根本不像gotos。例外就像单子。它允许您组合函数,并在更高级别捕获错误。GOTO不能做到这一点,尤其是在whic中的函数式编程语言中