Gewusst wie: Abfangen einer Nicht-CLS-Ausnahme
Aktualisiert: November 2007
Einige .NET-Sprachen, einschließlich C++/CLI, ermöglichen es Objekten, Ausnahmen auszulösen, die sich nicht von Exception ableiten. Diese Ausnahmen werden als Nicht-CLS-Ausnahmen oder Nicht-Ausnahmen bezeichnet. In Visual C# können Sie keine Nicht-CLS-Ausnahmen auslösen, sie aber auf zwei Weisen abfangen:
Innerhalb eines catch (Exception e)-Blocks als RuntimeWrappedException.
Standardmäßig fängt eine Visual C#-Assembly Nicht-CLS-Ausnahmen als umschlossene Ausnahmen ab. Verwenden Sie diese Methode, wenn Sie auf die ursprüngliche Ausnahme zugreifen müssen, die über die WrappedException-Eigenschaft verfügbar ist. Im Verfahren weiter unten in diesem Thema wird das Abfangen von Ausnahmen auf diese Weise beschrieben.
Innerhalb eines allgemeinen catch-Blocks (eines catch-Blocks, für den kein Ausnahmetyp angegeben wurde), der nach einem catch (Exception)-Block oder catch (Exception e)-Block platziert wird.
Verwenden Sie diese Methode, wenn Sie Aktionen (z. B. das Schreiben in eine Protokolldatei) als Reaktion auf Nicht-CLS-Ausnahmen ausführen möchten und 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 dem Code das folgende assemblyweit gültige Attribut hinzu, normalerweise in der Datei AssemblyInfo.cs: [assembly: RuntimeCompatibilityAttribute(WrapNonExceptionThrows = false)].
So fangen Sie eine Nicht-CLS-Ausnahme ab
Verwenden Sie in einem catch(Exception e) block das as-Schlüsselwort, um zu testen, ob e in eine RuntimeWrappedException umgewandelt werden kann.
Greifen Sie auf die ursprüngliche Ausnahme über die WrappedException-Eigenschaft zu.
Beispiel
Das folgende Beispiel zeigt, wie Sie eine Nicht-CLS-Ausnahme abfangen, die von einer in C++/CLR geschriebenen Klassenbibliothek ausgelöst wurde. Beachten Sie, dass in diesem Beispiel der Visual C#-Clientcode den Ausnahmetyp im Voraus als System.String identifiziert. Sie können die WrappedException-Eigenschaft wieder in ihren ursprünglichen Typ umwandeln, sofern auf diesen Typ über den Code zugegriffen werden kann.
// 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.
}
}