2011-04-28 15 views
8

Estoy usando IL para lanzar un Int32 y atraparlo. Esto es solo por curiosidad, no estoy tratando de lograr nada, así que por favor no me digan lanzar una excepción en lugar de int.cómo atrapar un int

.method private hidebysig static void Main(string[] args) cil managed 
{ 
    .entrypoint 
    // Code size  40 (0x28) 
    .maxstack 2 
    .locals init (object V_0, 
     int32 V_1) 
    IL_0000: nop 
    .try 
    { 
    IL_0001: nop 
    IL_0002: ldsfld  int32 ConsoleApplication3.Program::i 
    IL_0007: throw 
    } // end .try 
    catch [mscorlib]System.Object 
    { 
    IL_0008: stloc.0 
    IL_0009: nop 
    IL_000a: ldstr  "In Object catch" 
    IL_000f: call  void [mscorlib]System.Console::WriteLine(string) 
    IL_0014: nop 
    IL_0015: ldloc.0 
    IL_0016: unbox.any [mscorlib]System.Int32 
    IL_001b: stloc.1 
    IL_001c: ldloc.1 
    IL_001d: call  void [mscorlib]System.Console::WriteLine(int32) 
    IL_0022: nop 
    IL_0023: nop 
    IL_0024: leave.s IL_0026 
    } // end handler 
    IL_0026: nop 
    IL_0027: ret 
} // end of method Program::Main 

Esto no funciona, me sale la cadena "en la captura de objetos", pero cuando trato de desempacar consigo un System.InvalidCastException: especificar la conversión no es válida. ¿Cómo puedo obtener el valor de lo que se arrojó?

+0

Escribir en C# primero y luego mira el IL? – CarneyCode

+2

no puedo escribirlo en C#, porque C# como idioma no permite lanzar int –

+0

Como el 0 local es del tipo System.Exception, no me sorprende que no pueda destrabar esto como un int. –

Respuesta

5

En la versión 2.0 de la CLR, cuando se produce una excepción no compatible con CLS, el CLR construye automáticamente una instancia de la clase RuntimeWrappedException y inicializa su campo privado para referirse al objeto eso fue realmente lanzado. En efecto, el CLR ahora convierte todas las excepciones que no cumplen con CLS en CLS-conformly exceptions.

try 
{ 
    // ... 
} 
catch (RuntimeWrappedException e) 
{ 
    int a = (int)e.WrappedException; 
} 
+0

+1 (y, por cierto, [citación necesitada]) – Heinzi

+0

De MSDN: RuntimeWrappedException clase http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.runtimewrappedexception(v=VS .85) .aspx RuntimeCompatibilityAttribute Class http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.runtimecompatibilityattribute(v=VS.85).aspx –

Cuestiones relacionadas