Partilhar via


Como: Capturar uma exceção não CLS

Algumas linguagens. NET, inclusive C + c++ / CLI, permite que os objetos lançar exceções que não derivado de Exception. Essas exceções são chamadas de exceções não-CLS or sem exceções.In Visual C# Você não pode lançar exceções não-CLS, mas você pode capturá-los de duas maneiras:

  • Dentro de um catch (Exception e) Bloqueie sistema autônomo um RuntimeWrappedException.

    Por padrão, um Visual C# assembly captura exceções não-CLS sistema autônomo quebra automática de exceções. Use este método se você precisa de acesso para a exceção original, que pode ser acessado por meio de WrappedException propriedade. O procedimento neste tópico explica como capturar exceções dessa maneira.

  • Dentro de um bloco catch geral (um bloco catch sem um tipo de exceção especificado) que é colocado após um catch (Exception) ou catch (Exception e) bloco.

    Use este método quando desejar realizar alguma ação (sistema autônomo gravar um arquivo de log) em resposta a exceções não-CLS e não é necessário o acesso às informações de exceção.Por padrão o common linguagem tempo de execução empacota todas as exceções.Para desabilitar esse comportamento, adicione esse atributo no nível do assembly em seu código, geralmente no arquivo AssemblyInfo.cs: [assembly: RuntimeCompatibilityAttribute(WrapNonExceptionThrows = false)].

Para capturar uma exceção não-CLS

  1. Dentro de um catch(Exception e) block, use o as palavra-chave para testar se e pode ser convertido em um RuntimeWrappedException.

  2. Acessar a exceção original por meio de WrappedException propriedade.

Exemplo

O exemplo a seguir mostra como capturar uma exceção não-CLS foi acionada uma biblioteca e classe escrita em C + do c++ / CLR.Observe que, neste exemplo, a Visual C# código do cliente previamente sabe que é o tipo de exceção sendo lançado uma System.String. Você pode converter o WrappedException propriedade faça seu tipo original, desde que seja acessível a partir de seu código desse tipo.

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

Consulte também

Referência

Exceções e manipulação de exceção (guia de programação C#)

RuntimeWrappedException