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