2013-06-20 4 views
2

Я работаю над проектом, который реализован с использованием простой threads. Большинство ожидаемых исключений в приложении обрабатываются, однако есть случаи, когда один из потоков генерирует неожиданное исключение, и приложение просто падает (приложение равно I/O и Client-Server, поэтому практически невозможно обрабатывать все исключения).Необработанные исключения, брошенные в потоки, не пойманы

Чтобы исправить это, я пытаюсь определить глобальный UnhandledExceptionHandler, чтобы приложение отображало дружественное сообщение вместо сбоя. Это то, что я пробовал:

public partial class App : Application 
{ 
    private void Application_Startup(object sender, StartupEventArgs e) 
    { 
     AppDomain.CurrentDomain.UnhandledException += 
      new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 

     // The rest of the startup logic goes here 
    } 

    void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
    { 
     Utilities.DisplayUnhandledException((Exception)e.ExceptionObject); 
    } 
} 

Это не работает. CurrentDomain_UnhandledException никогда не вызывается. К сожалению, я не могу изменить структуру приложения, а это значит, что я не могу использовать параллельную библиотеку задач. Я не могу понять, почему это не работает. Есть ли другой способ обработки исключений, связанных с потоками? Любая помощь приветствуется.

+0

попробовать 'Application.SetUnhandledExceptionMode (UnhandledExceptionMode.CatchException) и' Application.ThreadException + = Application_ThreadException; ' – Blorgbeard

+0

Некоторые тщательные объяснения здесь: http://stackoverflow.com/questions/1472498/wpf-global-exception-handler –

ответ

3

Ваш подход правильный. Однако вы не сможете прекратить свое приложение.

Когда необработанное исключение выбрасывается в поток, который вы создали в своем приложении, будет вызван CurrentDomain_UnhandledException, что позволит вам регистрировать или сообщать об исключении. Однако, если e.IsTerminating не является false, вы не сможете остановить свое приложение от завершения. Вы можете узнать больше об этом поведении в Exceptions in Managed Threads.

Если вы обнаружили, что CurrentDomain_UnhandledException никогда не вызывается, вы должны убедиться, что для настройки обработчика вызывается Application_Startup.

Если у вас все еще есть проблемы, вы должны убедиться, что Utilities.DisplayUnhandledException не выбрасывает исключение. Это также приведет к немедленному прекращению вашей заявки. В частности, если e.ExceptionObject не относится к типу Exception, то его отличает Exception. Однако при нормальных обстоятельствах, когда объект исключения не является управляемым исключением, it will be wrapped in a RuntimeWrappedException.

Чтобы избежать прекращения действия приложения, вам нужно поймать исключение в «верхней части стека» вашего метода потока. Если это невозможно, потому что у вас нет доступа к коду, необработанные исключения являются признаком неисправного программного обеспечения, и даже если это неудобно, самое лучшее, что можно сделать, когда обнаруживается ошибка программного обеспечения, - это прекратить действие приложения, чтобы избежать коррупции ,

Смежные вопросы