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
Dentro de um catch(Exception e) block, use o as palavra-chave para testar se e pode ser convertido em um RuntimeWrappedException.
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.
}
}