Abfangen einer Nicht-CLS-Ausnahme

Einige .NET-Sprachen, einschließlich C++/CLI, erlauben Objekten, Ausnahmen auszulösen, die nicht aus Exception stammen. Diese Ausnahmen werden als Nicht-CLS-Ausnahmen oder Nicht-Ausnahmen bezeichnet. In C# können Sie keine Nicht-CLS-Ausnahmen auslösen. Sie können sie jedoch auf zwei Arten abfangen:

  • Innerhalb eines catch (RuntimeWrappedException e)-Blocks

    In der Standardeinstellung fängt eine Visual C#-Assembly Nicht-CLS-Ausnahmen als umschlossene Ausnahmen ab. Verwenden Sie diese Methode, wenn Sie Zugriff auf die ursprüngliche Ausnahme benötigen, auf die über die Eigenschaft RuntimeWrappedException.WrappedException zugegriffen werden kann. Weiter unten in diesem Thema wird erläutert, wie Abfragen auf diese Art und Weise abgefangen werden können.

  • Innerhalb eines allgemeinen Catch-Blocks (ein Catch-Block ohne angegebenen Ausnahmetyp), der nach allen anderen catch-Blocks eingefügt wird

    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. Standardmäßig umschließt die Common Language Runtime alle Ausnahmen. 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)].

So fangen Sie eine Nicht-CLS-Ausnahme ab

Greifen Sie in einem catch(RuntimeWrappedException e)-Block über die Eigenschaft RuntimeWrappedException.WrappedException auf die ursprüngliche Ausnahme zu.

Beispiel

Im folgenden Beispiel wird gezeigt, wie Sie eine Nicht-CLS-Ausnahme abfangen, die von einer in C++/CLI geschriebenen Klassenbibliothek ausgelöst wurde. Beachten Sie, dass in diesem Beispiel der C#-Clientcode im Voraus weiß, dass der Ausnahmetyp, der ausgelöst wird, System.String lautet. Wandeln Sie die Eigenschaft RuntimeWrappedException.WrappedException in den ursprünglichen Typ um, solange dieser Typ über Ihren Code erreicht werden kann.

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

try
{
    // throws gcnew System::String(  
    // "I do not derive from System.Exception!");  
    myClass.TestThrow();
}
catch (RuntimeWrappedException e)
{
    String s = e.WrappedException as String;
    if (s != null)
    {
        Console.WriteLine(s);
    }
}

Siehe auch