Share via


Procedimiento para detectar excepciones no compatibles con CLS

Algunos lenguajes. NET, incluido C++/CLI, permiten que los objetos inicien excepciones que no se derivan de Exception. Dichas excepciones se denominan excepciones de no compatibilidad con CLS o no excepciones. En C# no se pueden producir excepciones de no compatibilidad con CLS, pero se pueden detectar de dos formas:

  • Dentro de un bloque catch (RuntimeWrappedException e).

    De forma predeterminada, un ensamblado de Visual C# detecta las excepciones de no compatibilidad con CLS como excepciones ajustadas. Use este método si necesita tener acceso a la excepción original, a la que se puede tener acceso a través de la propiedad RuntimeWrappedException.WrappedException. El procedimiento mostrado más adelante en este tema explica cómo detectar las excepciones de esta manera.

  • Dentro de un bloque catch general (un bloque catch sin un tipo de excepción especificado) que se coloca detrás de todos los demás bloques catch.

    Use este método cuando quiera realizar alguna acción (como escribir en un archivo de registro) en respuesta a las excepciones de no compatibilidad con CLS y no necesita tener acceso a la información de excepción. De forma predeterminada, el Common Language Runtime ajusta todas las excepciones. Para deshabilitar este comportamiento, agregue este atributo de nivel de ensamblado en el código, normalmente en el archivo AssemblyInfo.cs: [assembly: RuntimeCompatibilityAttribute(WrapNonExceptionThrows = false)].

Para detectar una excepción de no compatibilidad con CLS

Dentro de un bloque catch(RuntimeWrappedException e), se accede a la excepción original mediante la propiedad RuntimeWrappedException.WrappedException.

Ejemplo

En el ejemplo siguiente se muestra cómo detectar una excepción de no compatibilidad con CLS iniciada desde una biblioteca de clases escrita en C++/CLI. Tenga en cuenta que en este ejemplo, el código de cliente de C# conoce por adelantado que el tipo de excepción que se inicia es System.String. Puede convertir la propiedad RuntimeWrappedException.WrappedException de vuelta a su tipo original siempre que el tipo sea accesible desde su 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 también