2011-04-28 231 views
8

我正在使用IL来抛出Int32并捕获它。这只是出于好奇心,我不想实现任何目标,所以请不要告诉我抛出异常而不是int。如何捕捉一个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 

这是不行的,我得到的字符串“在对象捕捉”但是当我尝试拆箱,我得到一个System.InvalidCastException:指定的转换无效。 我怎样才能得到所抛出的价值?

+0

用C#编写它,然后看看IL? – CarneyCode 2011-04-28 05:30:59

+2

不能写在C#中,因为C#作为一种语言不允许抛出int – 2011-04-28 05:33:06

+0

因为本地0是System.Exception类型的,所以不会让我感到意外的是,您不能将其作为int取消装箱。 – 2011-04-28 06:06:06

回答

5

在CLR中,当 非符合CLS则抛出异常的2.0版, 的CLR自动构造 RuntimeWrappedException类的 实例并 初始化它的私有字段以引用 到对象那实际上是 抛出。实际上,CLR现在将所有不符合CLS的异常变成 符合CLS的异常。

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

+1(顺便说一句,[需要的引证]) – Heinzi 2011-04-28 06:53:54

+0

来自MSDN: RuntimeWrappedException类 http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.runtimewrappedexception(v = VS .85).aspx RuntimeCompatibilityAttribute类 http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.runtimecompatibilityattribute(v=VS.85).aspx – 2011-04-28 08:48:57