Как работает try-catch в IL? - PullRequest
       9

Как работает try-catch в IL?

0 голосов
/ 05 февраля 2019

Рассмотрим этот код:

void Main()
{
    try {
        Console.Write("try ");
        throw new NotImplementedException();
    } 
    catch (NotImplementedException) {
        Console.Write("catch");
    }
}

Используя LINQPad, я вижу, что код компилируется в:

IL_0000:  nop         
IL_0001:  nop         
IL_0002:  ldstr       "try"
IL_0007:  call        System.Console.WriteLine
IL_000C:  nop         
IL_000D:  newobj      System.NotImplementedException..ctor
IL_0012:  throw       
IL_0013:  pop         
IL_0014:  nop         
IL_0015:  ldstr       "catch"
IL_001A:  call        System.Console.WriteLine
IL_001F:  nop         
IL_0020:  nop         
IL_0021:  leave.s

Приведенный выше код печатает try catch, если вместо этого я выбрасываю Exception, try печатается и программа завершается из-за необработанного исключения (как и ожидалось), код IL остается неизменным, за исключением этой строки:

IL_000D:  newobj      System.Exception..ctor

В чем логиказа этим?Я бы, за исключением логики, которая проверяет тип исключения, чтобы принять решение, идти в блок catch или нет.

...