Przechwytywanie wyjątku typu non-CLS

Niektóre języki platformy .NET, w tym C++/CLI, umożliwiają obiektom zgłaszanie wyjątków, które nie pochodzą z programu Exception. Takie wyjątki są nazywane wyjątkami innych niż CLS lub wyjątkami. W języku C# nie można zgłaszać wyjątków innych niż CLS, ale można je przechwycić na dwa sposoby:

  • catch (RuntimeWrappedException e) W bloku.

    Domyślnie zestaw języka Visual C# przechwytuje wyjątki inne niż CLS jako opakowane wyjątki. Użyj tej metody, jeśli potrzebujesz dostępu do oryginalnego wyjątku, do którego można uzyskać dostęp za pośrednictwem RuntimeWrappedException.WrappedException właściwości . W dalszej części tego tematu opisano sposób przechwytywania wyjątków w ten sposób.

  • W ogólnym bloku catch (blok catch bez określonego typu wyjątku), który jest umieszczany po wszystkich innych catch blokach.

    Użyj tej metody, jeśli chcesz wykonać jakąś akcję (taką jak zapisywanie w pliku dziennika) w odpowiedzi na wyjątki inne niż CLS, i nie potrzebujesz dostępu do informacji o wyjątkach. Domyślnie środowisko uruchomieniowe języka wspólnego opakowuje wszystkie wyjątki. Aby wyłączyć to zachowanie, dodaj ten atrybut na poziomie zestawu do kodu, zazwyczaj w pliku AssemblyInfo.cs: [assembly: RuntimeCompatibilityAttribute(WrapNonExceptionThrows = false)].

Aby przechwycić wyjątek inny niż CLS

catch(RuntimeWrappedException e) W bloku uzyskaj dostęp do oryginalnego wyjątku RuntimeWrappedException.WrappedException za pośrednictwem właściwości .

Przykład

W poniższym przykładzie pokazano, jak przechwycić wyjątek inny niż CLS, który został zgłoszony z biblioteki klas napisanej w języku C++/CLI. Należy pamiętać, że w tym przykładzie kod klienta języka C# z wyprzedzeniem wie, że zgłaszany typ wyjątku to System.String. Właściwość można rzutować RuntimeWrappedException.WrappedException z powrotem na oryginalny typ, o ile ten typ jest dostępny z poziomu kodu.

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

Zobacz też