Как все мы знаем, .NET Framework предоставляет немного специфическую реализацию обработки ThreadAbortException
.Означает, что это исключение не может быть перехвачено через блок try-catch-finally
.Взглянув немного глубже, мы узнаем, что это исключение на самом деле - catch, но повторно выбрасывается в конце блока catch.(На самом деле мы можем предотвратить развертывание стека с помощью метода Thread.ResetAbort()
).
Но давайте посмотрим на MSIL:
.try
{
IL_0001: nop
IL_0002: call void WCFTemp.Program::Method()
IL_0007: nop
IL_0008: nop
IL_0009: leave.s IL_0010
} // end .try
catch [mscorlib]System.Exception
{
IL_000b: stloc.0
IL_000c: nop
IL_000d: nop
IL_000e: leave.s IL_0010
} // end handler
IL_0010: nop
IL_0011: leave.s IL_0016
} // end .try
finally
{
IL_0013: nop
IL_0014: nop
IL_0015: endfinally
} // end handler
Как мы видим, не существует инструкции, которая делает время выполненияповторно выдать этот тип исключения.
Так что мой вопрос, как это реализовано?