C++异常与 C# 异常

本文关键字:异常 C++ | 更新日期: 2023-09-27 18:37:03

在一篇名为"更干净、更优雅、更难识别"的旧博客文章中,作者指出:

在C++中,情况并没有那么糟糕C++因为异常仅在执行过程中的特定点引发。在 C# 中,可以随时引发异常。

他这话到底是什么意思?

C++异常与 C# 异常

首先,我会犹豫是否指责陈雷蒙德将任何东西与任何东西混为一谈。

我怀疑他的意思是,在C++中,只有在存在throw语句的情况下才会抛出异常。只要足够深入地了解代码和库函数,就可以准确确定可能从何处引发异常。另一方面,在 C# 中,运行时环境可能随时引发异常。例如,尝试调用任何其他程序集中的任何函数时,可能会遇到安全异常。

也许换

一种说法:

C++可以编写提供 nothrow 保证的函数。

我不懂C#,我很确定Raymond Chen知道,所以我接受他的说法,即"在C#中,可以随时引发异常"。因此,不能在 C# 中编写提供 nothrow 保证的函数。

在C++中,nothrow 函数是提供其他异常保证的函数的重要组成部分。为了做出强有力的保证(即实现交易),你通常需要像nothrow交换这样的东西,它执行多个语句而不会被异常中断。为了做出基本的保证,你需要 nothrow 资源清理,你可能还需要短时间的 nothrow 代码,其中你的对象的状态违反了它们的类不变量。

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

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

在完整阅读本文时,我注意到他主要谈论示例代码不正确(对实际代码有明显的影响)。因此,如果他的 C# 声明由于 C# 代码的某些特殊情况而不正确,这些代码绝对不会抛出,但这样的 C# 代码从未出现在教程示例中,那么他仍然会对语言的教学方式有一个重要的观点——遗漏了使示例代码异常安全所需的基本内容的示例可能是不好的例子, 他们冒着教坏习惯的风险。与错误代码示例不同,学生(陈说)无法一眼看出该示例是否糟糕,因此可能没有意识到需要做更多的工作才能使它们"不坏"。

我认为他在谈论异步异常,在 C# 中,由于另一个线程中发生的事情,可以在一个线程中引发异步异常。(请注意,陈的博客条目中的一位评论者以同样的方式解释他所写的内容,尽管不幸的是陈没有回应。

例如,请参阅 http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx,例如一个线程调用表示另一个线程的对象的 Abort 方法,导致另一个线程获得ThreadAbortException

他的意思可能是,在C++异常不是由框架引发的,而只是来自你的代码(或由将他们的代码视为"他们自己的代码"的人编写的外部代码)。在 C# 中,框架中也可能发生异常。

然而,我不明白的是,为什么作者似乎更喜欢只从你自己的代码中引发异常。