2009-08-03 6 views
0

J'ai une application qui est mixte Winforms et WPF. En Winforms, j'ai un gestionnaire global d'exception qui est définie comme suit:Pourquoi mon exception n'est pas interceptée

AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 
Application.ThreadException += Application_ThreadException; 

Cela attire toujours des exceptions partout dans ma demande qui se produisent qui ne sont pas prévu et manipulé avec élégance.

Pour WPF, tout ce que je semble être en mesure de capturer est:

wpfAppDomain = new System.Windows.Application(); 
wpfAppDomain.DispatcherUnhandledException += 
     wpfAppDomain_DispatcherUnhandledException; 

Cela ne signifie pas toujours attraper des exceptions globales, et je trouve souvent que les exceptions sont avalés quelque part et je ne sais pas pourquoi.

Comment puis-je faire un gestionnaire global d'exception pour WPF qui peut attraper une exception qui se produit qui est non gérée?

+0

Est-ce que vous testez ceci dans Visual Studio ou sur l'exécutable? Visual Studio va essayer d'intercepter certaines exceptions et d'interrompre l'exécution de vos applications. – Zyphrax

+3

Qui a lancé cette exception? Si John Skeet a fait, vous ne pouvez pas l'attraper homme;) – amazedsaint

+0

Je ne tenterais jamais d'attraper des exceptions du grand et puissant John Skeet. – Russ

Répondre

1

Il y a plusieurs cas où ce code ne sera pas attraper une exception et ce, par la conception

  • L'exception est tout simplement uncatchable. Par exemple, un runtime lancé StackOverflowException
  • L'exception n'est pas gérée dans votre code, mais dans le cadre principal de WPF.

Il n'existe aucun moyen d'intercepter toutes les exceptions levées. Le faire vous permettrait de violer la sémantique du code qui devrait toujours fonctionner.

+0

Je comprends que tout n'est pas attrapable, il ne devrait pas l'être, mais un bon exemple serait une exception SQL. Le code winform les attrape tous, mais WPF semble les avaler. – Russ

0

Avez-vous essayé cela après avoir appelé SetUnhandledExceptionMode? Comme ceci:

// Force all exceptions through our handler. 
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 
0

DispatcherUnhandledException attrape seule exception du code appelé par un répartiteur (comme son nom l'indique), il est censé attraper les exceptions lancées lorsqu'il est appelé à partir du code WPF.

Elle ne couvre pas les exceptions lancées à partir de: WinForms, BackgroundWorker, la piscine ou les fils que vous vous a commencé.

vous pouvez toujours utiliser AppDomain.CurrentDomain.UnhandledException pour attraper ceux-ci.

Questions connexes