【问题标题】:Will CLR handle both CLS-compliant and non-CLS compliant exceptions?CLR 会同时处理符合 CLS 和不符合 CLS 的异常吗?
【发布时间】:2023-04-01 12:54:01
【问题描述】:

只是为了我的澄清:

我能否在 .NET Framework 中同时抛出符合 CLS 和不符合 CLS 的异常?我正在使用 C# 3.0。

当我发现异常时

catch(Exception ex)
{

}
  • 它会只捕获符合 CLS 的异常吗?
  • RuntimeWrappedException 类有什么用(可以举个简单的例子吗?)。

【问题讨论】:

    标签: c# asp.net .net exception


    【解决方案1】:
    1. 是的,您可以在 .NET Framework 中引发不符合 CLS 的异常,只要您使用允许的语言,例如C++。
    2. 不,您不能在 C# 中引发不符合 CLS 的异常。
    3. 不,它会捕获所有异常,因为任何不符合 CLS 的异常都将包装在派生自 ExceptionRuntimeWrappedException 中。
    4. 您不会抛出RuntimeWrappedException,CLR 会。 MSDN有详细的描述,我在这里引用:

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

    如果您想区别对待 CLS 和非 CLS 异常,只需按正确的顺序捕获它们即可:

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

    【讨论】:

      【解决方案2】:

      虽然 C# 编译器只允许开发人员抛出异常派生的对象,但在 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 
      }
      }
      

      【讨论】:

        【解决方案3】:

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

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

        由于 RuntimeWrappedException 派生自 Exception,所以一个 catch (Exception) 将捕获非 CLS 异常。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-09-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多