在 C++ 和 C# 中使用 try/catch 的正确方法是啥? [复制]

Posted

技术标签:

【中文标题】在 C++ 和 C# 中使用 try/catch 的正确方法是啥? [复制]【英文标题】:What's the right way to use try/catch in C++ and C#? [duplicate]在 C++ 和 C# 中使用 try/catch 的正确方法是什么? [复制] 【发布时间】:2012-10-19 15:51:03 【问题描述】:

可能重复:When and how should I use exception handling?

我看到程序员在 C# 和 C++。 在 C# 中,这似乎很常见。但在 C++ 中,它似乎晦涩难懂。 使用它们的正确方法是什么?

【问题讨论】:

看看this question 取决于语言。每种语言都会有所不同。 【参考方案1】:

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

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

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

    当您要对异常信息执行某项操作然后将异常冒泡时。

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

【讨论】:

您还需要记住,抛出异常是一个代价高昂的过程,因此应避免抛出不必要的异常。 在 Java 中(以及在 C# 范围内,但通过使用来缓解)捕获异常也用于在允许异常向上传播之前进行非内存资源管理(由于 RAII,这在 C++ 中不是必需的) 【参考方案2】:

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

正如贾斯汀所说,您可能需要捕获并重新引发异常以进行本地清理 - 这将解释 C# 代码。

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

【讨论】:

以上是关于在 C++ 和 C# 中使用 try/catch 的正确方法是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

SqlDataReader 和 T-SQL:在使用来自 C# 的“异步”调用时使用“try...catch”和“throw”时不会传播异常

C# try catch 中使用return 的问题

c++ throw with try catch all always hits 在 C++ 11 14 和 17 中终止

多线程 Win32 C++ 程序在多个线程中使用 try/catch 崩溃

MFC TRY CATCH 与 C++ 尝试使用 MFC 捕获异常

C# try-catch