381 votes

Gestionnaire d’exception globale de WPF

parfois, dans des circonstances non reproductibles, mon application WPF se bloque sans aucun message. L’application il suffit de fermer instantanément.

Où est le meilleur endroit pour mettre en place le bloc Try/Catch mondial. J’ai au moins mettre en œuvre un messagebox avec : « Désolé pour le dérangement... »

Toute aide serait bienvenu, Merci.

556voto

Drew Noakes Points 69288

Vous pouvez intercepter les exceptions non gérées à différents niveaux:

  1. AppDomain.UnhandledException De tous les threads dans le domaine d'application.
  2. Dispatcher.UnhandledException À partir d'une seule INTERFACE utilisateur spécifique répartiteur fil.
  3. Application.DispatcherUnhandledException Du principal de l'INTERFACE utilisateur répartiteur fil dans votre application WPF.
  4. TaskScheduler.UnobservedTaskException depuis l'intérieur de chaque domaine d'application qui utilise un planificateur de tâches pour les opérations asynchrones.

Vous devriez songer à ce niveau, vous avez besoin pour intercepter les exceptions non gérées.

À choisir entre les #2 et #3 dépend de si vous utilisez plus d'un WPF fil. C'est tout à fait exotique situation et si vous n'êtes pas sûr de savoir si vous êtes ou pas, alors il est plus probable que vous ne l'êtes pas.

176voto

Thomas Levesque Points 141081

Vous pouvez gérer le `` événement

EDIT : en fait, cet événement est probablement plus adéquat :``

135voto

Sergey Points 642

Un petit exemple de code pour Application.Dispatcher.UnhandledException :

J’ai ajouté ce code dans App.xaml.cs

45voto

jurev Points 480

J'utilise le code suivant dans mon applications WPF pour montrer un "Désolé pour le dérangement" de la boîte de dialogue à chaque fois qu'une unhandeled exception se produit. Il affiche le message d'exception, et demande à l'utilisateur s'ils veulent fermer l'application ou ignorer l'exception et continuer (ce dernier cas est pratique en cas de non-fatale des exceptions se produisent et l'utilisateur peut toujours normalement continuer à utiliser l'application).

En Application.xaml ajouter le Démarrage du gestionnaire d'événements:

<Application .... Startup="Application_Startup>

En Application.xmal.cs de code à ajouter de Démarrage fonction de gestionnaire d'événement qui va enregistrer l'application gestionnaire d'événements:

using System.Windows.Threading;

private void Application_Startup(object sender, StartupEventArgs e)
{
    // Global exception handling  
    Application.Current.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(AppDispatcherUnhandledException);    
}

void AppDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{    
    \#if DEBUG   // In debug mode do not custom-handle the exception, let Visual Studio handle it

    e.Handled = false;

    \#else

    ShowUnhandeledException(e);    

    \#endif     
}

void ShowUnhandeledException(DispatcherUnhandledExceptionEventArgs e)
{
    e.Handled = true;

    string errorMessage = string.Format("An application error occurred.\nPlease check whether your data is correct and repeat the action. If this error occurs again there seems to be a more serious malfunction in the application, and you better close it.\n\nError:{0}\n\nDo you want to continue?\n(if you click Yes you will continue with your work, if you click No the application will close)",

    e.Exception.Message + (e.Exception.InnerException != null ? "\n" + 
    e.Exception.InnerException.Message : null));

    if (MessageBox.Show(errorMessage, "Application Error", MessageBoxButton.YesNoCancel, MessageBoxImage.Error) == MessageBoxResult.No)   {
        if (MessageBox.Show("WARNING: The application will close. Any changes will not be saved!\nDo you really want to close it?", "Close the application!", MessageBoxButton.YesNoCancel, MessageBoxImage.Warning) == MessageBoxResult.Yes)
    {
        Application.Current.Shutdown();
    } 
}

11voto

Robibobi Points 98

Outre les postes ci-dessus :

sera pas intercepter les exceptions qui sont levées à partir d’un autre thread puis le thread principal. Vous devez gérer ces exceptions sur son Thread réel. Mais si vous souhaitez les gérer sur votre gestionnaire d’exceptions globales, vous pouvez le passer au thread principal :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X