首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.net异常捕获块

.net异常捕获块
EN

Stack Overflow用户
提问于 2011-03-18 05:24:21
回答 6查看 1.7K关注 0票数 10

下面的catch块有什么区别?

代码语言:javascript
复制
try
{
    ...
}
catch
{
    ...
}

代码语言:javascript
复制
try
{
    ...
}
catch(Exception)
{
    ...
}

我意识到,在任何一种情况下,异常实例都不可用,但我能用其中一个实例做一些不能用另一个做的事情吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 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)}

票数 7
EN

Stack Overflow用户

发布于 2011-03-18 05:27:30

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

票数 7
EN

Stack Overflow用户

发布于 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,这限制了您捕获符合

的异常。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5345436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档