C ++异常与C#异常

时间:2012-06-14 08:29:02

标签: c# c++ exception error-handling exception-safety

在一篇名为Cleaner, more elegant, and harder to recognize的旧博客文章中,作者说:

  

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

他到底是什么意思?

4 个答案:

答案 0 :(得分:4)

首先,我会毫不犹豫地指责Raymond Chen对任何事情都感到困惑。

我怀疑他的意思是在C ++中,异常仅在存在throw语句的地方抛出。只要您深入了解代码和库函数,就可以确切地确定可以抛出异常的位置。另一方面,在C#中,运行时环境可能会随时抛出异常。例如,您可能会在尝试调用任何其他程序集中的任何函数时遇到安全性异常。

答案 1 :(得分:3)

也许换一种说法:

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

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

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

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

如果Chen对C#的主张是错误的,那么他的意思可能并不重要。因为他错了。

在完整阅读文章后,我注意到他主要谈论的是示例代码不正确(对实际代码有明显的影响)。因此,如果他的C#声明由于C#代码的一些特殊情况确实不会丢失,但这样的C#代码永远不会出现在教程示例中,那么他仍然会对语言的教学方式有一个重要的观点 - 例子为了使示例代码异常安全而省略了你需要做的重要事情可能是不好的例子,他们冒着教习坏习惯的风险。与错误代码示例不同,学生(陈说)一眼就看不出这个例子是坏的,因此可能没有意识到需要做更多的工作才能使它们“不坏”。

答案 2 :(得分:2)

我认为他在讨论异步异常,在C#中可以在一个线程中引发异常异常,因为在另一个线程中会发生异常。 (请注意,Chen的博客文章中的一位评论者以同样的方式解释了他所写的内容,但遗憾的是陈没有对此做出回应。)

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

答案 3 :(得分:0)

他可能意味着在 C ++中,框架不会抛出异常,而只是来自您的代码(或者将他们的代码视为“自己的代码”的人编写的外部代码)。 在C#中,异常也可能在框架中发生。

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