C++ 异常与 C# 异常

fre*_*low 5 c# c++ error-handling exception exception-safety

在一篇题为“更简洁、更优雅、更难识别”的旧博客文章中,作者指出:

在 C++ 中,它并不是那么糟糕,因为C++ 异常仅在执行期间的特定点引发。在 C# 中,可以随时引发异常。

他到底是什么意思?

Ste*_*sop 3

也许换一种说法:

在 C++ 中可以编写提供 nothrot 保证的函数。

我不懂 C#,但我很确定 Raymond Chen 懂,所以我接受他的说法“在 C# 中,可以随时引发异常”。因此,您无法在 C# 中编写提供 nothrot 保证的函数。

在 C++ 中,nothrow 函数是提供其他异常保证的函数的一个非常重要的组成部分。为了做出强有力的保证(即实现事务),您通常需要类似无抛出交换之类的东西,它可以执行多个语句而不会因异常而中断。为了做出基本保证,您需要 nothrot 资源清理,并且可能还需要简短的 nothrot 代码段,其中对象的状态违反了它们的类不变量。

枚举 C++ 中可能引发异常的所有“特定点”可能很乏味,但实际上,编写一段绝对不会引发异常的短代码并不难。如果您不能在 C# 中做到这一点,那就是一个重要的区别。

如果 Chen 关于 C# 的说法是错误的,那么他的意思可能并不重要。因为他错了。

在完整阅读这篇文章后,我注意到他主要谈论的是示例代码不正确(对真实代码有明显的影响)。因此,如果他的 C# 主张是不正确的,因为 C# 代码的某些特殊情况肯定不会抛出,但此类 C# 代码从未出现在教程示例中,那么他仍然有一个关于语言教学方式的重要观点 - 示例遗漏了使示例代码异常安全所需执行的基本内容可能是不好的示例,并且它们可能会养成坏习惯。与错误代码示例不同,学生(陈说)无法一眼看出该示例是坏的,因此可能没有意识到需要做更多的工作才能使它们“不错”。