Процесс winform завершается внезапно, не улавливая никаких исключений.
Есть некоторые ошибки, которые я не могу решить в своем приложении WinForm.
Мой процесс приложения WinForm внезапно выходит из строя в ненормальном режиме с низкой вероятностью, и он не может поймать ни одного исключения перед выходом. Код приложения WinForm содержит следующее:
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException); Application.ApplicationExit += new EventHandler(Application_ApplicationExit); Application.ThreadExit += new EventHandler(Application_ThreadExit); AppDomain.CurrentDomain.ProcessExit += new EventHandler(CurrentDomain_ProcessExit);
В функциях CurrentDomain_UnhandledException и Application_ThreadException записываются некоторые журналы и создается файл дампа, эти функции работают, если я создаю исключение по собственной инициативе. но они не работают, пока WinForm внезапно выходит из строя в ненормальном режиме.
И конфигурация WinForm содержит это:
<?xml version="1.0"?> <configuration> ... <runtime> <legacyCorruptedStateExceptionsPolicy enabled="true"/> </runtime> </configuration>
Код приложения WinForm содержит более сотни тысяч строк. Я в замешательстве, не могу найти, где что не так. Не мог бы кто-нибудь помочь мне найти жучки ?
Что я уже пробовал:
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException); Application.ApplicationExit += new EventHandler(Application_ApplicationExit); Application.ThreadExit += new EventHandler(Application_ThreadExit); AppDomain.CurrentDomain.ProcessExit += new EventHandler(CurrentDomain_ProcessExit);
<legacyCorruptedStateExceptionsPolicy enabled="true"/>
CHill60
Где в вашем приложении находится тот код, которым вы поделились, и происходит ли это в режиме отладки, режиме выпуска или в обоих режимах?
ZhaoChaoHui
Код написан в начале "static void Main(string[] param)", они работают как в режиме отладки, так и в режиме выпуска.
static void Main(string[] param)
{
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
......
Ошибки выхода внезапно происходят в режиме выпуска, но я не уверен, происходит ли это в режиме отладки или нет.
Richard Deeming
Если вы используете async
код или Tasks
, возможно, вам придется подписаться на Планировщиком.UnobservedTaskException[^] событие.
В .NET 4.0 исключение в ненаблюдаемой задаче завершит процесс, если это событие не будет обработано. Это было изменено в .NET 4.5, хотя есть переключатель конфигурации, чтобы включить старое поведение.
ZhaoChaoHui
У меня есть добавить ThrowUnobservedTaskExceptions
конфиг:<runtime>
<legacyCorruptedStateExceptionsPolicy enabled="true"/>
<ThrowUnobservedTaskExceptions enabled="true"/>
</runtime>
Это действительно работа, в то время как я бросаю исключение в задачи по своей собственной инициативе. Я надеюсь, что он сможет поймать Жуков. Спасибо.