问题描述
有何以下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块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!