CLR会处理CLS-Complaint和非CLS投诉异常吗?

时间:2009-10-07 11:35:59

标签: c# asp.net exception-handling

仅供我澄清:

我可以在.NET Framework中同时抛出CLS-Complaint和非CLS投诉异常吗?。我正在使用C#3.0。

当我遇到异常时

catch(Exception ex)
{

}
  • 它只会捕获CLS-Complaint异常吗?
  • RuntimeWrappedException类的用途是什么(我可以有一个简单的例子吗?)。

3 个答案:

答案 0 :(得分:12)

  1. 是的,您可以在.NET Framework中抛出非CLS兼容的异常,只要您使用允许它的语言,例如: C ++。
  2. 不,您不能在C#中抛出非CLS兼容的异常。
  3. 不会,它会捕获所有异常,因为任何非CLS兼容的异常都将包含在RuntimeWrappedException中,该Exception派生自RuntimeWrappedException
  4. 您不会抛出try { // some code catch(RuntimeWrappedException ex) { // non-CLS exceptions catch(Exception ex) { // CLS exceptions } ,CLR会这样做。 MSDN有一个详细的描述,我在这里引用:

    某些语言(如C ++)允许您抛出任何托管类型的异常。其他语言(如Microsoft C#和Visual Basic)要求从Exception类派生每个抛出的异常。为了保持语言之间的兼容性,公共语言运行库(CLR)在RuntimeWrappedException对象中包装不是从Exception派生的对象。

  5. 如果您想以不同方式处理CLS和非CLS异常,只需按正确顺序捕获它们:

    {{1}}

答案 1 :(得分:1)

虽然C#编译器允许开发人员仅在之前抛出Exception派生的对象 C#版本2.0,C#编译器确实允许开发人员捕获非符合CLS的异常 通过使用这样的代码:

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 :(得分:1)

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

从.Net Framework 2.0开始,所有非CLS异常都包含在RuntimeWrappedException内。

由于RuntimeWrappedException派生自Exception,因此catch(Exception)将捕获非CLS异常。

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