как поймать инт - PullRequest
       18

как поймать инт

8 голосов
/ 28 апреля 2011

Я использую 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

Это не работает, я получаю строку «In Object catch», но при попытке распаковать я получаю System.InvalidCastException: указанное приведение недопустимо. Как я могу получить значение того, что было брошено?

1 Ответ

5 голосов
/ 28 апреля 2011

В версии 2.0 CLR, когда выдается не-CLS-совместимое исключение, CLR автоматически создает экземпляр Класс RuntimeWrappedException и инициализирует свое личное поле для ссылки к объекту, который был на самом деле выброшены. По сути, CLR теперь превращается все не-CLS-совместимые исключения в CLS-совместимые исключения.

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