Jak zachytit výjimku nekompatibilní se specifikací CLS
Některé jazyky .NET, včetně C++/CLI, umožňují objektům vyvolat výjimky, které nejsou odvozeny z Exception. Takové výjimky se nazývají výjimky jiné než CLS nebo výjimky. V jazyce C# nelze vyvolat výjimky bez cls, ale můžete je zachytit dvěma způsoby:
catch (RuntimeWrappedException e)
V bloku.Sestavení Visual C# ve výchozím nastavení zachytává výjimky bez CLS jako zabalené výjimky. Tuto metodu použijte, pokud potřebujete přístup k původní výjimce, ke které lze přistupovat prostřednictvím RuntimeWrappedException.WrappedException vlastnosti. Postup dále v tomto tématu vysvětluje, jak tímto způsobem zachytit výjimky.
V rámci obecného bloku catch (blok catch bez zadaného typu výjimky), který je vložen za všechny ostatní
catch
bloky.Tuto metodu použijte, pokud chcete provést nějakou akci (například zápis do souboru protokolu) v reakci na výjimky, které nejsou clsly, a nepotřebujete přístup k informacím o výjimce. Modul CLR (Common Language Runtime) ve výchozím nastavení zabalí všechny výjimky. Chcete-li toto chování zakázat, přidejte tento atribut na úrovni sestavení do kódu, obvykle v souboru AssemblyInfo.cs:
[assembly: RuntimeCompatibilityAttribute(WrapNonExceptionThrows = false)]
.
Zachycení výjimky jiného typu než CLS
catch(RuntimeWrappedException e)
V rámci bloku přejděte k původní výjimce RuntimeWrappedException.WrappedException prostřednictvím vlastnosti.
Příklad
Následující příklad ukazuje, jak zachytit výjimku, která není CLS vyvolán z knihovny tříd napsané v C++/CLI. Všimněte si, že v tomto příkladu kód klienta jazyka C# předem ví, že typ výjimky, který je vyvolán, je .System.String Vlastnost můžete přetypovat RuntimeWrappedException.WrappedException zpět původní typ, pokud je tento typ přístupný z vašeho kódu.
// 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);
}
}