Внутренняя реализация ThreadAbortException - PullRequest
1 голос
/ 09 ноября 2011

Как все мы знаем, .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

Как мы видим, не существует инструкции, которая делает время выполненияповторно выдать этот тип исключения.

Так что мой вопрос, как это реализовано?

1 Ответ

4 голосов
/ 09 ноября 2011

Это не имеет ничего общего с ИЛ. Исключения реализуются CLR, они дополняют встроенную поддержку Windows для SEH (структурированная обработка исключений). Самый первый код, который запускается при возникновении исключения, - это код внутри CLR. Который затем может делать то, что ему нравится. Поиск блока catch и запуск его кода - это только одна из его задач. То, что происходит после выполнения этого кода, зависит от CLR.

Вы можете получить более подробную информацию об этом, прочитав исходный код SSCLI20. Но имейте в виду, что clr / src / vm / excep.cpp определенно является одним из самых сложных кусков кода для борьбы.

...