Compartir a través de


Cómo: Detectar excepciones no compatibles con CLS

Actualización: noviembre 2007

Algunos lenguajes de .NET, incluido C++/CLI, permiten que los objetos inicien excepciones que no se derivan de Exception. Tales excepciones se denominan excepciones que no son CLS o no excepciones. En Visual C# no puede iniciar excepciones que no son CLS, pero puede detectarlas de dos maneras:

  • Dentro de un bloque catch (Exception e) como RuntimeWrappedException.

    De forma predeterminada, un ensamblado Visual C# detecta las excepciones que no son CLS como excepciones ajustadas. Utilice este método si necesita obtener acceso a la excepción original, lo cual se hace a través de la propiedad WrappedException. El procedimiento posterior de este tema explica cómo detectar excepciones de este modo.

  • Dentro de un bloque catch general (un bloque catch sin un tipo de excepción especificado) colocado detrás de un bloque catch (Exception) o catch (Exception e).

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

Para detectar una excepción que no es CLS

  1. Dentro de catch(Exception e) block, utilice la palabra clave as para comprobar si e se puede convertir en RuntimeWrappedException.

  2. Obtenga acceso a la excepción original a través de la propiedad WrappedException.

Ejemplo

El ejemplo siguiente muestra cómo detectar una excepción que no es CLS iniciada desde una biblioteca de clases escrita en C++/CLR. Tenga en cuenta que, en este ejemplo, el código de cliente Visual C# sabe de antemano que el tipo de excepción que se va a iniciar es System.String. Puede volver a convertir la propiedad WrappedException en su tipo original siempre que ese tipo sea accesible desde el código.

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

Vea también

Referencia

Excepciones y control de excepciones (Guía de programación de C#)

RuntimeWrappedException