Partilhar via


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

Algumas linguagens .NET, incluindo C++/CLI, permitem que objetos lancem exceções que não derivam do Exception. Tais exceções são chamadas de exceções não-CLS ou não-exceções. Em C#, você não pode lançar exceções não-CLS, mas pode capturá-las de duas maneiras:

  • Dentro de um catch (RuntimeWrappedException e) bloco.

    Por padrão, um assembly do Visual C# captura exceções não-CLS como exceções encapsuladas. Use este método se precisar de acesso à exceção original, que pode ser acessada através da RuntimeWrappedException.WrappedException propriedade. O procedimento mais adiante neste tópico explica como capturar exceções dessa maneira.

  • Dentro de um bloco de captura geral (um bloco de captura sem um tipo de exceção especificado) que é colocado depois de todos os outros catch blocos.

    Use esse método quando quiser executar alguma ação (como gravar em um arquivo de log) em resposta a exceções não-CLS e não precisar acessar as informações de exceção. Por padrão, o common language runtime encapsula todas as exceções. Para desativar esse comportamento, adicione esse atributo de nível de assembly ao seu código, normalmente no arquivo AssemblyInfo.cs: [assembly: RuntimeCompatibilityAttribute(WrapNonExceptionThrows = false)].

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

Dentro de um catch(RuntimeWrappedException e) bloco, acesse a exceção original através da RuntimeWrappedException.WrappedException propriedade.

Exemplo

O exemplo a seguir mostra como capturar uma exceção não-CLS que foi lançada de uma biblioteca de classes escrita em C++/CLI. Observe que, neste exemplo, o código do cliente C# sabe de antemão que o tipo de exceção que está sendo lançado é um System.Stringarquivo . Você pode converter a propriedade de volta seu RuntimeWrappedException.WrappedException tipo original, desde que esse tipo seja acessível a partir do seu código.

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

Consulte também