Домашняя страница Глобальная обработка исключений в С#
Публикация
Отменить

Глобальная обработка исключений в С#

В предыдущей статье рассказывалось про глобальную обработку исключений в C++. В этой статье будет показано, как решить ту же задачу в языке C#.

В .Net есть событие AppDomain.CurrentDomain.UnhandledException которое вызывается для всех не перехваченных исключений. Оно позволяет приложению записать в журнал информацию об исключении до того, как системный обработчик по умолчанию сообщит пользователю об исключении и прекратит выполнение приложения. Если имеется достаточно информации о состоянии приложения, можно выполнить другие действия, такие как сохранение данных программы для последующего восстановления. Рекомендуется действовать осторожно, поскольку данные программы могут быть повреждены, если исключение не обработано.

Событие Application.ThreadException позволяет приложению Windows Forms обрабатывать исключения, возникающие в потоках Windows Forms, которые в противном случае не были бы обработаны. Присоедините обработчики событий к событию ThreadException, чтобы обработать эти исключения, которые оставят приложение в неопределенном состоянии. Если это возможно, исключения следует обработать с помощью блоков структурной обработки исключений.

Чтобы добавить свой глобальный обработчик исключений, нужно подписаться на данные события:

1
2
3
4
5
6
7
8
9
AppDomain.CurrentDomain.UnhandledException += delegate( object sender, UnhandledExceptionEventArgs args )
{
    Trace.WriteLine( "Global exception: " + args.ExceptionObject.ToString( ) );
};
Application.ThreadException += delegate( Object sender, ThreadExceptionEventArgs args )
{
    Trace.WriteLine( "Global exception: " + args.Exception.ToString( ) );
    Environment.Exit( 0 );
};

Данные методы не предназначены для штатного использования. Программист должен обрабатывать исключения “на месте” с использованием конструкции try-catch. Данные методы предназначены для получения информации в экстренных ситуациях. Эти ситуации указывают на наличие проблем с коде, которые должны быть устранены.

Есть статья по решению такой же задачи в C++: Глобальная обработка исключений в С++

Публикация защищена лицензией CC BY 4.0 .

Потрясающий снимок Зеты Змееносца!

Получение стека функций с использованием StackTrace