CLR会处理CLS-Complaint和非CLS投诉例外吗?

仅供我澄清:

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

当我抓住exception

catch(Exception ex) { } 
  • 它只会捕获CLS-Complaintexception吗?
  • RuntimeWrappedException类有什么用(我可以举一个简单的例子吗?)。

  1. 是的,您可以在.NET Framework中抛出非CLS兼容的exception,只要您使用允许它的语言,例如C ++。
  2. 不,您不能在C#中抛出非CLS兼容的exception。
  3. 不,它将捕获所有exception,因为任何非CLS兼容的exception都将包装在RuntimeWrappedException ,该Exception派生自Exception
  4. 你不会抛出一个RuntimeWrappedException ,CLR RuntimeWrappedException 。 MSDN有一个详细的描述,我在这里引用:

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

如果要以不同方式处理CLS和非CLSexception,只需按正确的顺序捕获它们:

 try { // some code catch(RuntimeWrappedException ex) { // non-CLS exceptions catch(Exception ex) { // CLS exceptions } 

尽管C#编译器允许开发人员仅在C#2.0版之前抛出Exception派生的对象,但C#编译器确实允许开发人员通过使用如下代码来捕获非CLS兼容的exception:

 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 } } 

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

从.Net Framework 2.0开始,所有非CLSexception都包含在RuntimeWrappedException中 。

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

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