Я просто работал над исправлением обработки исключений в приложении .NET 2.0 и наткнулся на какую-то странную проблему с Application.ThreadException .
То, что я хочу - это иметь возможность отлавливать все исключения из событий за элементами GUI (например, button_Click и т. Д.). Затем я хочу отфильтровать эти исключения по «фатальности», например, с некоторыми типами исключений приложение должно продолжать работать, а с другими оно должно завершиться.
В другом приложении .NET 2.0 я узнал, что по умолчанию только в режиме отладки исключения фактически вызывают вызов Application.Run или Application.DoEvents. В режиме выпуска этого не происходит, и исключения должны быть «перехвачены» с помощью события Application.ThreadException.
Однако теперь я заметил, что объект исключения, передаваемый в ThreadExceptionEventArgs события Application.ThreadException, всегда является самым внутренним исключением в цепочке исключений . Для целей регистрации / отладки / проектирования я действительно хочу всю цепочку исключений, хотя. Нелегко определить, какая внешняя система вышла из строя, например, когда вы просто обрабатываете SocketException: когда он упакован как, например, исключение NpgsqlException, по крайней мере, вы знаете, что это проблема с базой данных.
Итак, как добраться до всей цепочки исключений из этого события? Возможно ли вообще или мне нужно спроектировать обработку исключений другим способом?
Обратите внимание, что у меня -сортировка есть обходной путь с использованием Application.SetUnhandledExceptionMode , но это далеко от идеала, потому что мне придется свернуть свой собственный цикл сообщений.
РЕДАКТИРОВАТЬ: чтобы предотвратить больше ошибок, метод GetBaseException () НЕ делает то, что я хочу : он просто возвращает самое внутреннее исключение, в то время как единственное, что у меня уже есть, это самое внутреннее исключение. Я хочу получить самое крайнее исключение!