.net异常catch块

Bal*_*a R 10 c# catch-block

以下捕获块之间有什么区别?

try
{
    ...
}
catch
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

try
{
    ...
}
catch(Exception)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

我知道,在任何一种情况下,异常实例都不可用,但有什么我可以用另一个不可能做到的吗?

Gab*_*abe 7

它们几乎是一样的.

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

某些编程语言可能支持不能表示为从System.Exception派生的对象的异常,尽管C#代码永远不会生成此类异常.一般的catch子句可用于捕获此类异常.因此,一般的catch子句在语义上与指定System.Exception类型的子句不同,因为前者也可以捕获来自其他语言的异常.

请注意,虽然C#在两者之间有所区别,但它们实际上与.NET 2.0相同,如本博客所述:

感谢最近2.0 CLR的变化,如果你有代码决定抛出一个int(System.Int32),CLR现在会用RuntimeWrappedException包装它,并且编译器已经更新为你提供了警告上面的第二个条款现在是死代码

warning CS1058: A previous catch clause already catches all exceptions. All non-exceptions thrown will be wrapped in a System.Runtime.CompilerServices.RuntimeWrappedException

对于CLR如何知道为程序集执行此操作,您会注意到编译器现在向程序集添加RuntimeCompatibilityAttribute,告诉它:
.custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = {property bool 'WrapNonExceptionThrows' = bool(true)}


Jor*_*ren 7

catch与参数不同,不带参数将捕获非符合CLS的异常catch (Exception).

  • @havok:我想这样做的目的是,如果你调用第三方库,如果碰巧抛出一个非CLS兼容的异常,你就不会无助. (2认同)