Есть ли альтернатива legacyUnhandledExceptionPolicy в .NET5 / .NET6?

Я знаю, что подобные вопросы задавались и раньше, но я не могу найти точного ответа для NET5 / NET6, так что поехали.

Я хочу предотвратить сбой приложения WinForms из-за необработанных исключений и вместо этого что-то показывать / регистрировать. Рецепт второй части примерно такой.

      Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
AppDomain.CurrentDomain.UnhandledException +=
            (sender, args) => HandleUnhandledException(args.ExceptionObject as Exception);
Application.ThreadException +=
            (sender, args) => HandleUnhandledException(args.Exception);

См., Например, этот вопрос (их гораздо больше).

Теперь с частью «предотвращения сбоев» становится все сложнее. Умение обращаться Application.ThreadExceptionпредотвращает сбой из-за исключения в UI-Thread. К сожалению, это не относится к потокам без пользовательского интерфейса и AppDomain.CurrentDomain.UnhandledException (есть даже IsTerminating-имущество в UnhandledExceptionс args). В .NET-Framework, если вы не против использовать что-то со словом "устаревшее", legacyUnhandledExceptionPolicy(см. документы) был ответ. С его помощью исключения потоков больше не вызывают сбой приложения.

К сожалению, в NET5 / NET6 это не работает (а может, я просто не могу понять). Таким образом, возникает вопрос: как сделать так, чтобы исключение в потоке не привело к сбою вашего (WinForms) приложения, современного NET6-способа? (есть рецепты, позволяющие навсегда приостановить цепочку - что не кажется очень хорошей идеей)

И если вам интересно, почему, у меня есть обработчик событий для System.IO.Ports.SerialPortс DataReceived-событие, подобное этому

          if (control.InvokeRequired) {
        control.Invoke(DataReceivedEventHandler);
    } else {
        //process data and show it in UI
    }

И где-то внутри обработки данных в некоторых ситуациях возникает IndexOutOfRange-Exception было выброшено, что привело к сбою всего приложения. И хотя регистрация исключения в порядке, лучше предотвратить сбой в целом.

0 ответов

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