首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CLR会同时处理符合CLS和非CLS的异常吗?

CLR会同时处理符合CLS和非CLS的异常吗?
EN

Stack Overflow用户
提问于 2009-10-07 11:35:58
回答 3查看 2.9K关注 0票数 8

我只想澄清:

我可以在.NET框架中同时抛出符合CLS和非CLS的异常吗?我正在使用C# 3.0。

当我发现一个异常

代码语言:javascript
复制
catch(Exception ex)
{

}
  • 它是否只捕获符合CLS的异常?
  • RuntimeWrappedException类的用途是什么(我可以举一个简单的例子吗?)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-10-07 11:42:50

  1. 是的,您可以在.NET框架中抛出非CLS兼容的异常,只要您使用允许它的语言,例如C++。
  2. 不,您不能在C#中抛出非CLS兼容的异常。
  3. 不,它将捕获所有异常,因为任何非CLS兼容的异常都将被包装在RuntimeWrappedException中,这是从Exception派生的。
  4. 如果不抛出RuntimeWrappedException,则CLR会抛出。MSDN有详细的描述,我在这里引用: 某些语言(如C++ )允许您抛出任何托管类型的异常。其他语言(如Microsoft C#和Visual )要求从异常类派生每个引发的异常。为了保持语言之间的兼容性,公共语言运行库(CLR)封装不从RuntimeWrappedException对象中的异常派生的对象。

如果您想以不同的方式对待CLS和非CLS异常,只需按正确的顺序捕获它们:

代码语言:javascript
复制
try {
    // some code
catch(RuntimeWrappedException ex) {
    // non-CLS exceptions
catch(Exception ex) {
    // CLS exceptions
}
票数 13
EN

Stack Overflow用户

发布于 2009-10-07 11:45:20

尽管C#编译器只允许开发人员抛出异常派生对象,但在C#版本2.0之前,C#编译器确实允许开发人员使用以下代码捕获不符合CLS的异常:

代码语言:javascript
复制
private void SomeMethod() { 
try { 
// Inside the try block is where you put code requiring 
// graceful recovery or common cleanup operations. 
}
catch (Exception e) { 
// Before C# 2.0, this block catches CLS-compliant exceptions only 
// In C# 2.0, this block catches CLS- & non-CLS- compliant exceptions 
throw; // Re-throws whatever got caught 
}
catch { 
// In all versions of C#, this block catches 
// CLS- & non-CLS- compliant exceptions 
throw; // Re-throws whatever got caught 
}
}
票数 2
EN

Stack Overflow用户

发布于 2009-10-07 11:48:11

CLS允许它,但并不是所有的语言都允许。它可以用C++/CLI来完成,但不能用C#、VB.NET来完成。

从.Net Framework2.0开始,所有非CLS异常都封装在RuntimeWrappedException中。

由于RuntimeWrappedException是从异常派生的,所以catch (异常)将捕获非CLS异常。

从RuntimeWrappedException中,您可以通过RuntimeWrappedException.WrappedException属性访问原始异常。

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

https://stackoverflow.com/questions/1531077

复制
相关文章

相似问题

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