在C++和C#中使用try/catch的正确方法是什么?

1 c# c++ exception-handling

可能重复:
何时以及如何使用异常处理?

我已经看到程序员在C#和C++ 中的每个方法中都有"try {} catch(){}"块.在C#中似乎很平常.但在C++中它似乎模糊不清.使用它们的正确方法是什么?

Jus*_*ner 9

实际上只有三次你应该使用try/catch:

  1. 在应用程序的顶层,您可以向用户显示友好的错误消息(并希望记录一些有用的信息,以便您以后可以解决问题).

  2. 何时可以从异常中正确恢复(或者至少清理不再需要的资源).

  3. 当你要用异常信息做某事时,然后冒出异常.

除了这三种情况之外,没有理由使用try/catch块.您应该让Exception冒泡到调用者,以便他们可以在需要时处理它.

  • 在Java中(以及C#的范围,但在使用时减轻了),在允许异常传播之前,捕获异常也用于非内存资源管理(由于RAII,这在C++中不是必需的) (3认同)

Use*_*ess 6

处理异常的意图应该推迟到可以做一些有用的事情,无论是通知用户,重新尝试还是其他什么.因此,捕获每个函数中的异常通常是糟糕的设计.

正如Justin所说,你可能需要捕获并重新抛出异常才能进行局部清理 - 这可以解释C#代码.

在C++中,惯用方法是RAII,它使用确定性破坏来执行本地清理,并避免捕获处理程序,这些处理程序不能真正处理但只是重新抛出.