Gewusst wie: Abfangen einer Nicht-CLS-AusnahmeHow to: Catch a non-CLS Exception

Einige .NET-Sprachen, einschließlich C++/CLI, erlauben Objekten, Ausnahmen auszulösen, die nicht aus Exception stammen.Some .NET languages, including C++/CLI, allow objects to throw exceptions that do not derive from Exception. Diese Ausnahmen werden als Nicht-CLS-Ausnahmen oder Nicht-Ausnahmen bezeichnet.Such exceptions are called non-CLS exceptions or non-Exceptions. In Visual C#Visual C# können Sie keine Nicht-CLS-Ausnahmen auslösen. Sie können sie jedoch auf zwei Arten abfangen:In Visual C#Visual C# you cannot throw non-CLS exceptions, but you can catch them in two ways:

  • Innerhalb eines catch (Exception e)-Blocks als eine RuntimeWrappedException.Within a catch (Exception e) block as a RuntimeWrappedException.

    In der Standardeinstellung fängt eine Visual C#Visual C#-Assembly Nicht-CLS-Ausnahmen als umschlossene Ausnahmen ab.By default, a Visual C#Visual C# assembly catches non-CLS exceptions as wrapped exceptions. Verwenden Sie diese Methode, wenn Sie Zugriff auf die ursprüngliche Ausnahme benötigen, auf die über die Eigenschaft WrappedException zugegriffen werden kann.Use this method if you need access to the original exception, which can be accessed through the WrappedException property. Weiter unten in diesem Thema wird erläutert, wie Abfragen auf diese Art und Weise abgefangen werden können.The procedure later in this topic explains how to catch exceptions in this manner.

  • Innerhalb eines allgemeinen Catch-Blocks (ein Catch-Block ohne angegebenen Ausnahmetyp), der nach einem catch (Exception)- oder catch (Exception e)-Block eingefügt wird.Within a general catch block (a catch block without an exception type specified) that is put after a catch (Exception) or catch (Exception e) block.

    Verwenden Sie diese Methode, wenn Sie eine Aktion (z.B. das Schreiben in eine Protokolldatei) als Reaktion auf Nicht-CLS-Ausnahmen ausführen möchten und Sie keinen Zugriff auf die Ausnahmeinformationen benötigen.Use this method when you want to perform some action (such as writing to a log file) in response to non-CLS exceptions, and you do not need access to the exception information. Standardmäßig umschließt die Common Language Runtime alle Ausnahmen.By default the common language runtime wraps all exceptions. Um dieses Verhalten zu deaktivieren, fügen Sie dieses Attribut auf Assemblyebene Ihrem Code hinzu, in der Regel in die Datei „AssemblyInfo.cs“: [assembly: RuntimeCompatibilityAttribute(WrapNonExceptionThrows = false)].To disable this behavior, add this assembly-level attribute to your code, typically in the AssemblyInfo.cs file: [assembly: RuntimeCompatibilityAttribute(WrapNonExceptionThrows = false)].

So fangen Sie eine Nicht-CLS-Ausnahme abTo catch a non-CLS exception

  1. Verwenden Sie innerhalb von catch(Exception e) block das Schlüsselwort as, um zu testen, ob e in eine RuntimeWrappedException umgewandelt werden kann.Within a catch(Exception e) block, use the as keyword to test whether e can be cast to a RuntimeWrappedException.

  2. Greifen Sie über die Eigenschaft WrappedException auf die ursprüngliche Ausnahme zu.Access the original exception through the WrappedException property.

BeispielExample

Das folgende Beispiel zeigt, wie Sie eine Nicht-CLS-Ausnahme abfangen, die von einer in C++/CRL geschriebenen Klassenbibliothek ausgelöst wurde.The following example shows how to catch a non-CLS exception that was thrown from a class library written in C++/CLR. Beachten Sie, dass in diesem Beispiel der Visual C#Visual C#-Clientcode im Voraus weiß, dass der Ausnahmetyp, der ausgelöst wird, eine System.String darstellt.Note that in this example, the Visual C#Visual C# client code knows in advance that the exception type being thrown is a System.String. Wandeln Sie die Eigenschaft WrappedException in den ursprünglichen Typ um, solange dieser Typ über Ihren Code erreicht werden kann.You can cast the WrappedException property back its original type as long as that type is accessible from your code.

// Class library written in C++/CLR.  
   ThrowNonCLS.Class1 myClass = new ThrowNonCLS.Class1();  

   try  
   {  
    // throws gcnew System::String(  
    // "I do not derive from System.Exception!");  
    myClass.TestThrow();   
   }  

   catch (Exception e)  
   {  
    RuntimeWrappedException rwe = e as RuntimeWrappedException;  
    if (rwe != null)      
    {  
      String s = rwe.WrappedException as String;  
      if (s != null)  
      {  
        Console.WriteLine(s);  
      }  
    }  
    else  
    {  
       // Handle other System.Exception types.  
    }  
   }             

Siehe auchSee Also

RuntimeWrappedException
Ausnahmen und AusnahmebehandlungExceptions and Exception Handling