Поделиться через


Практическое руководство. Перехват несовместимого с CLS исключения

Обновлен: Ноябрь 2007

Некоторые языки .NET, включая C++/CLI, позволяют вызывать исключения, которые не являются производными от Exception. Такие исключения называются несовместимыми с CLS исключениями или несовместимыми исключениями. В Visual C# невозможно вызвать несовместимое с CLS исключение, однако такое исключение можно перехватить следующими двумя способами.

  • В блоке catch (Exception e) как RuntimeWrappedException.

    По умолчанию сборка Visual C# перехватывает несовместимые с CLS исключения как упакованные исключения. Данный метод используется, если требуется получить доступ к оригинальному исключению, которое доступно через свойство WrappedException. Процедура, приведенная далее в этом разделе, описывает перехват исключений данным способом.

  • В блоке общего перехвата (это блок перехвата, для которого не указан тип исключения), который помещается после блока catch (Exception) или catch (Exception e).

    Данный метод используется, если требуется выполнить какое-либо действие (например, произвести запись в файл журнала) в ответ на несовместимое с CLS исключение, а доступ к сведениям об исключении не требуется. По умолчанию среда CLR упаковывает все исключения. Чтобы запретить это поведение, добавьте следующий атрибут уровня сборки в код (обычно атрибут добавляют в файл AssemblyInfo.cs): [assembly: RuntimeCompatibilityAttribute(WrapNonExceptionThrows = false)].

Чтобы перехватить несовместимое с CLS исключение

  1. В catch(Exception e) block используйте ключевое слово as, чтобы проверить, можно ли привести e к RuntimeWrappedException.

  2. Обратитесь к оригинальному исключению, используя свойство WrappedException.

Пример

В следующем примере показан перехват несовместимого с CLS исключения, которое было вызвано из библиотеки классов, написанной на C++/CLR. Обратите внимание, что в этом примере коду клиента Visual C# заранее известно, что вызывается исключение типа System.String. Свойство WrappedException можно привести к оригинальному типу при условии, что этот тип доступен из кода.

// 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.
    }
   }           

См. также

Ссылки

Исключения и обработка исключений (руководство по программированию в C#)

RuntimeWrappedException