下面的catch块有什么区别?
try
{
...
}
catch
{
...
}和
try
{
...
}
catch(Exception)
{
...
}我意识到,在任何一种情况下,异常实例都不可用,但我能用其中一个实例做一些不能用另一个做的事情吗?
发布于 2011-03-18 05:26:35
它们几乎是一样的。
来自C#语言规范的第8.10节:
某些编程语言可能支持无法表示为从System.Exception派生的对象的异常,尽管C#代码永远不会生成此类异常。一般的catch子句可用于捕获此类异常。因此,一般的catch子句与指定类型System.Exception的catch子句在语义上是不同的,因为前者还可以捕获来自其他语言的异常。
请注意,尽管C#区分了两者,但正如this blog所指出的,它们实际上与.NET 2.0相同
多亏了2.0CLR2.0中最近的一项更改,如果您的代码决定在某个地方抛出一个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)}
发布于 2011-03-18 05:27:30
与catch (Exception)不同,不带参数的catch将捕获不符合CLS的异常。
发布于 2011-03-18 05:28:38
来自Why catch(Exception)/empty catch is bad
根据您的语言生成的
代码,MSIL空的catch语句也可能同样糟糕。C#将一个空的catch语句转换为catch(System.Object),这意味着您最终会捕获所有异常-即使是不兼容的异常。VB的表现更好,它将一个空的catch语句转换为catch e as System.Exception,这限制了您捕获符合
的异常。
https://stackoverflow.com/questions/5345436
复制相似问题