Обычно я использую что-то подобное, чтобы попытаться перехватить все неожиданные исключения верхнего уровня.
using System;
static class Program
{
[STAThread]
static void Main(string[] argv)
{
try
{
AppDomain.CurrentDomain.UnhandledException += (sender,e)
=> FatalExceptionObject(e.ExceptionObject);
Application.ThreadException += (sender,e)
=> FatalExceptionHandler.Handle(e.Exception);
// whatever you need/want here
Application.Run(new MainWindow());
}
catch (Exception huh)
{
FatalExceptionHandler.Handle(huh);
}
}
static void FatalExceptionObject(object exceptionObject) {
var huh = exceptionObject as Exception;
if (huh == null) {
huh = new NotSupportedException(
"Unhandled exception doesn't derive from System.Exception: "
+ exceptionObject.ToString()
);
}
FatalExceptionHandler.Handle(huh);
}
}
Может быть, это тебе тоже поможет? Этот основной код маршрутизирует все три способа перехвата неожиданных исключений верхнего уровня с помощью одного вызова метода. Все, что вам сейчас нужно, это статический класс FatalExceptionHandler
, который включает обработку исключений верхнего уровня в свой метод Handle
.
И действительно, любой разработчик приложений знает, что на самом деле есть только две вещи:
- Показать / записать исключение, как вы считаете нужным
- Убедитесь, что вы завершили / убили процесс приложения
Если вы считаете, что второй пункт является странным, помните, что мы стараемся делать это в первую очередь только для действительно исключительных ситуаций. Эти вещи, вероятно, являются ошибками, которые нуждаются в изменениях в вашем приложении, чтобы быть точно исправленными. Любая другая обработка исключений - функциональная разновидность - должна быть ниже внутри вашего фактического программного кода, перехватывая особые виды исключений, где это имеет смысл, и обрабатывая их там, где это имеет смысл. Все остальное должно всплыть на вашем FatalExceptionHandler
, чтобы заявить о себе и остановить работу поврежденной программы из поврежденного состояния
Мертвые программы не лгут ...; -)