Типы исключений поврежденного состояния, отличные от AccessViolationException

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

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

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

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

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
97
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

Эта функция (то есть макрос COMPlusThrow, который ее обертывает) вызывается в нескольких местах в (основной) среде 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#. Но в зависимости от того, чего вы В самом деле пытаетесь достичь своим вопросом, который может привести к серьезному бритью. ;-)

Это было чрезвычайно полезно. Я узнал от вас, что «поврежденное состояние процесса» было существовавшей ранее концепцией, ортогональной типу исключения SEH (или управляемого). Я получил гораздо лучшее представление о типе условий, когда он попадает, и (из-за того, что заметил CorruptionSeverity.ReuseForReraise в коде CLR), что его перемещение внутри процесса через границы Reflection и AD также является необязательным, с TargetInvocationException еще одним примером потенциального CSE, и я опубликую особенно ценный урок об OutOfMemoryException в виде отдельной пары вопросов и ответов.

Jirka Hanika 12.04.2019 13:33

Разделите пару Q+A созданный, как и было обещано.

Jirka Hanika 29.04.2019 15:19

Другие вопросы по теме