异常处理(EH)似乎是当前的标准,通过搜索网络,我找不到任何新的想法或方法来改进或取代它(好吧,存在一些变化,但没有什么新奇的)。

尽管大多数人似乎忽略了它或只是接受它,EH有一些巨大的缺点:异常对代码是不可见的,它创建了许多许多可能的退出点。软件的Joel写了一篇关于它的文章。与goto的对比非常完美,这让我再次思考EH。

我尽量避免EH,只使用返回值,回调或任何符合目的的东西。但是,当您必须编写可靠的代码时,现在就不能忽略EH了:它从new开始,可能会抛出异常,而不只是返回0(就像以前一样)。这使得几乎每一行c++代码都容易出现异常。然后在c++基本代码中抛出异常的地方更多……STD lib可以这样做,等等。

这感觉就像在摇摇欲坠的地面上行走。因此,现在我们不得不关注异常!

但这很难,真的很难。你必须学会编写异常安全的代码,即使你有一些这方面的经验,仍然需要仔细检查每一行代码的安全性!或者您开始到处放置try/catch块,这会使代码变得混乱,直到达到不可读的状态。

EH replaced the old clean deterministical approach (return values..), which had just a few but understandable and easily solveable drawbacks with an approach that creates many possible exit points in your code, and if you start writing code that catches exceptions (what you are forced to do at some point), then it even creates a multitude of paths through your code (code in the catch blocks, think about a server program where you need logging facilities other than std::cerr ..). EH has advantages, but that's not the point.

我真正的问题是:

你真的写异常安全的代码吗? 您确定最后的“生产就绪”代码是异常安全的吗? 你能确定这是真的吗? 你知道和/或实际上使用有效的替代方法吗?


当前回答

你真的写异常安全的代码吗?

嗯,我当然打算。

您确定最后的“生产就绪”代码是异常安全的吗?

我确信我使用异常构建的24/7服务器全天候运行,不会泄漏内存。

你能确定这是真的吗?

很难确定任何代码都是正确的。通常情况下,人们只能根据结果来判断

你知道和/或实际上使用有效的替代方法吗?

不。使用异常比我过去30年在编程中使用过的任何替代方法都更简洁、更容易。

其他回答

如果假设“任何行都可以抛出”,就不可能编写异常安全的代码。异常安全代码的设计主要依赖于某些契约/保证,你应该在你的代码中期望、观察、遵循和实现这些契约/保证。拥有保证永不抛出的代码是绝对必要的。还有其他类型的异常保证。

换句话说,创建异常安全代码在很大程度上是程序设计的问题,而不仅仅是简单的编码问题。

不过,我真的很喜欢使用Eclipse和Java (Java新手),因为如果缺少EH处理程序,它会在编辑器中抛出错误。这使得忘记处理异常变得更加困难……

另外,使用IDE工具,它会自动添加try / catch块或另一个catch块。

你真的写异常安全的代码吗?

嗯,我当然打算。

您确定最后的“生产就绪”代码是异常安全的吗?

我确信我使用异常构建的24/7服务器全天候运行,不会泄漏内存。

你能确定这是真的吗?

很难确定任何代码都是正确的。通常情况下,人们只能根据结果来判断

你知道和/或实际上使用有效的替代方法吗?

不。使用异常比我过去30年在编程中使用过的任何替代方法都更简洁、更容易。

我们中的一些人更喜欢像Java这样的语言,它迫使我们声明方法抛出的所有异常,而不是像c++和c#那样使它们不可见。

如果处理得当,异常优于错误返回码,如果没有其他原因,只是因为您不需要手动在调用链中传播失败。

也就是说,低级API库编程应该避免异常处理,并坚持错误返回代码。

根据我的经验,在c++中很难编写干净的异常处理代码。最后我经常使用new(nothrow)。

一般来说,EH是好的。但是c++的实现不是很友好,因为很难判断你的异常捕获覆盖率有多好。例如,Java使这很容易,如果你不处理可能的异常,编译器将倾向于失败。