Есть ли альтернатива 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 было выброшено, что привело к сбою всего приложения. И хотя регистрация исключения в порядке, лучше предотвратить сбой в целом.