Рассмотрим этот код:
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 или нет.