本文介绍了.NET异常catch块的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有何以下catch块之间的区别?

What's the difference between the following catch blocks?

try
{
    ...
}
catch
{
    ...
}

try
{
    ...
}
catch(Exception)
{
    ...
}

我意识到,在这两种情况下,异常实例不可用,但有什么我可以用一个做到这一点是不可能与其他?

I realize, in either case, the exception instance is not available but is there anything that I can do with one that is not possible with the other?

推荐答案

他们的几乎的相同

从C#语言规范,第8.10节:

From the C# Language Specification, section 8.10:

有些编程语言可能支持不能表示为从System.Exception派生的对象例外,尽管这种异常不可能由C#代码生成。一般的catch子句可以用来捕捉这种例外。因此,一般的catch子句是从一个指定的System.Exception类型,在不同的语义前者还可以捕捉来自其他语言的异常。

请注意,虽然C#两者之间的区别,它们实际上一样的.NET 2.0,通过的:

Note that while C# differentiates between the two, they are effectively the same as of .NET 2.0, as noted by this blog:

由于在最近的变化2.0 CLR,如果你有代码,决定扔,说,一个int(System.Int32)的地方,CLR会现已与RuntimeWrappedException包装它,编译器已经更新到给你警告说,第二条以上现在死代码

警告CS1058:先前的catch子句已经捕获所有异常。所有非抛出的异常将被包装在一个System.Runtime.CompilerServices.RuntimeWrappedException

有关的CLR是如何知道为做这个动作你装配,你会发现编译器现在增加了一个RuntimeCompatibilityAttribute你的组件它告诉给。结果
.custom实例无效[mscorlib程序] System.Runtime.CompilerServices.RuntimeCompatibilityAttribute ::男星(){=布尔财产'WrapNonExceptionThrows'=布尔(真)}

For how the CLR knows to do this action for your assembly, you'll notice the compiler now adds a RuntimeCompatibilityAttribute to your assemblies telling it to:
.custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = {property bool 'WrapNonExceptionThrows' = bool(true)}

这篇关于.NET异常catch块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-21 11:26