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);
    }
}

Viz také