如何捕获一个int

Nit*_*ari 8 .net il exception-handling

我正在使用IL来抛出一个Int32并捕获它.这只是出于好奇,我不想做任何事情,所以请不要告诉我抛出异常而不是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
Run Code Online (Sandbox Code Playgroud)

这不起作用,我得到字符串"在对象捕获",但当我尝试取消框时,我得到一个System.InvalidCastException:指定的强制转换是无效的.我怎样才能获得抛出的价值?

Qry*_*taL 5

在CLR的2.0版本中,当抛出非CLS兼容的异常时,CLR会自动构造RuntimeWrappedException类的实例并初始化其私有字段以引用实际抛出的对象.实际上,CLR现在将所有符合CLS的异常转换为符合CLS的异常.

try
{
    // ...
}
catch (RuntimeWrappedException e)
{
    int a = (int)e.WrappedException;
}
Run Code Online (Sandbox Code Playgroud)