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