2011-04-28 239 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