Связано с this question, я хотел бы заставить CLR позволить моему .NET 4.5.2 приложению уловить поврежденные исключения состояний с единственной целью их регистрации и прекращения приложения. Каков правильный способ сделать это, если у меня есть catch (Exception ex)
в нескольких местах вокруг приложения?Изящное обращение с поврежденными исключениями состояния
Итак, после того, как я укажу атрибут <legacyCorruptedStateExceptionsPolicy>
, если я правильно понял, все обработчики catch (Exception ex)
поймают исключения, такие как AccessViolationException
и счастливо продолжат.
Да, я знаю, что catch (Exception ex)
- это Bad Idea ™, но если CLR по крайней мере поместит правильную трассировку стека в журнал событий, я был бы более чем счастлив объяснить клиенту, что его серверное приложение быстро не работает в 1:00 и быть в сети на ночь - это хорошо. Но, к сожалению, CLR регистрирует unrelated exception в журнале событий, а затем закрывает процесс, чтобы я не мог узнать, что произошло на самом деле.
Вопрос заключается в том, как сделать это произойдет, процесс широка:
if the exception thrown is a Corrupted State Exception:
- write the message to the log file
- end the process
(Update)
Другими словами, это, вероятно, работать для большинства исключений в простом приложении:
[HandleProcessCorruptedStateExceptions]
[SecurityCritical]
static void Main() // main entry point
{
try
{
}
catch (Exception ex)
{
// this will catch CSEs
}
}
Но, это не будет работать:
- Необслуживаемые исключения домена приложения (т. выброшено на не переднем плане потоков)
- приложений для Windows Service (которые не имеют фактическую точку входа
Main
)
Так что похоже <legacyCorruptedStateExceptionsPolicy>
это единственный способ, чтобы сделать эту работу, в этом случае я дон Не знаете, как сбой после регистрации CSE?
Спасибо, так это значит, что я могу украсить метод обработчика 'AppDomain.CurrentDomain.UnhandledException' с помощью' [HandleProcessCorruptedStateExceptions] ', и он наверняка поймает CSE? – Lou
Да, вы определенно можете. Я отредактирую свой ответ, чтобы подчеркнуть этот аспект. – haindl