ZhaoChaoHui Ответов: 0

Процесс 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>

Это действительно работа, в то время как я бросаю исключение в задачи по своей собственной инициативе. Я надеюсь, что он сможет поймать Жуков. Спасибо.

0 Ответов