Поврежденные типы исключений состояния, отличные от AccessViolationException - PullRequest
1 голос
/ 10 апреля 2019

Какие типы исключений Corrupted State возможны, кроме AccessViolationException?

В частности, безопасно ли предположить, что ни один из OutOfMemoryException, ThreadAbortedException, SEHException, RuntimeWrappedException и т. Д. Не требует использования HandleProcessCorruptedStateExceptionsAttribute, чтобы быть пойманным, скажем, catch (Exception) пункт

Меня интересуют даже примеры, догадки, приближения того, какие типы исключений иногда или всегда рассматриваются CLR как CSE. Существующие веб-ресурсы создают впечатление, что CSE является почти синонимом AccessViolationException, но я подозреваю, что это может быть слишком неточным даже для моих скромных потребностей.

Мне нужно знать, всякий раз, когда я замечаю catch (OutOfMemoryException) (или другую конструкцию, явно имеющую дело с другими низкоуровневыми исключениями) в древнем коде, за которую я несу периферическую ответственность, мог ли код обработки исключений быть сделан недоступным или рискуя стать недоступным, путем перехода на .NET 4.

До сих пор я лучше всего сканировал документацию Microsoft на тип исключения для упоминания HandleProcessCorruptedStateExceptionsAttribute, но мне интересно, предполагается ли, что эта деталь поведения будет полностью совместима со всеми версиями .NET 4 и / или тщательно документировано для каждого типа управляемого исключения, затронутого изменением CLR.

1 Ответ

1 голос
/ 11 апреля 2019

Я не уверен, существует ли хотя бы конечный набор исключений (независимо от версий CLR, но в целом).

По крайней мере нативный код (или сам CLR) может вызвать любое исключение, обозначаяэто как состояние повреждения, если вы посмотрите на эту функцию CLR.

   // Signature simplified for purposes of that answer, check link above for actual signature.
   void RealCOMPlusThrow(OBJECTREF throwable, CorruptionSeverity severity = NotCorrupting);

Эта функция (то есть макрос COMPlusThrow, который ее оборачивает) вызывается в нескольких местах (Core) CLR.

Функция IsProcessCorruptedStateException, кажется, в конечном счете используется для определения, считается ли исключение повреждением состояния.Эта функция имеет две «перегрузки».

Один довольно полезен, потому что в нем перечислены следующие коды исключений:

    STATUS_ACCESS_VIOLATION
    STATUS_STACK_OVERFLOW
    EXCEPTION_ILLEGAL_INSTRUCTION
    EXCEPTION_IN_PAGE_ERROR
    EXCEPTION_INVALID_DISPOSITION
    EXCEPTION_NONCONTINUABLE_EXCEPTION
    EXCEPTION_PRIV_INSTRUCTION
    STATUS_UNWIND_CONSOLIDATE

По крайней мере, они в частичном порядке сопоставляются с .NETобъекты исключений.

Однако, другой"просто" проверяет , был ли отмечен объект исключения (собственный, не управляемый), приводящий к повреждению состояния.

Теперь я очень далек от того, чтобы быть экспертом по коду CLR, поэтому YMMV.

Можно, конечно, потратить часы на код CLR, чтобы выяснить, как работает обработка поврежденных состояний и какие последствияэто для обработки тех, кто в C # коде.Но в зависимости от того, что вы действительно пытаетесь достичь по вашему вопросу, это может привести к серьезному бритью.; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...