IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[C#] Exception Handler


Sujet :

Windows Forms

  1. #1
    Membre actif Avatar de diaboloche
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    592
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 592
    Points : 274
    Points
    274
    Par défaut [C#] Exception Handler
    Bonjour,

    J'essaye de faire un petit système de gestion d'erreur dont mes pages pourraient hériter...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
                ExceptionHandler eh = new ExceptionHandler();
                Application.ThreadException += new ThreadExceptionEventHandler(eh.OnThreadException);            
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                throw new System.ArgumentException("The specified type is unknow", "type");
            }     
        }
     
        public class ExceptionHandler
        {        
            public void OnThreadException(object sender, ThreadExceptionEventArgs t)
            {
                DialogResult result = DialogResult.Cancel;
                try
                {
                    result = this.ShowThreadExceptionDialog(t.Exception);
                }
                catch
                {
                    try
                    {
                        MessageBox.Show("Fatal Error", "Fatal Error", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop);
                    }
                    finally
                    {
                        Application.Exit();
                    }
                }
     
                // Exits the program when the user clicks Abort.
                if (result == DialogResult.Abort)
                {
                    Application.Exit();
                }
            }
     
            // Creates the error message and displays it.
            private DialogResult ShowThreadExceptionDialog(Exception e)
            {
                string errorMsg = "An error occurred please contact the adminstrator with the following information:\n\n";
                errorMsg = errorMsg + e.Message + "\n\nStack Trace:\n" + e.StackTrace;
                return MessageBox.Show(errorMsg, "Application Error", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop);
            }
        }
    J'ai essayé ceci, mais je ne passe jamais par OnThreadException...
    Quelqu'un pourrait m'expliquer ?

    Merci.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par MSDN
    To use this event, y ou must attach a handler before you call Application.Run.

    If an exception occurs in the main application thread and no catch block in the call stack handles it, the default exception handler catches it and terminates the application. If an exception occurs in a thread other than the main application thread, the thread exits, but the application continues to run.
    Donc quand tu passes dans Form1_Load, c'est trop tard pour attacher le handler... il faut que tu le fasses dans le Main, avant Application.Run.

    Sinon tu peux aussi gérer l'évènement AppDomain.UnhandledException

    Mais cette méthode de gestion d'erreur ne doit servir que pour les exceptions vraiment imprévisibles, pour éviter un crash de l'application. Ca ne remplace pas une gestion d'erreur structurée à base de try/catch

  3. #3
    Membre actif Avatar de diaboloche
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    592
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 592
    Points : 274
    Points
    274
    Par défaut
    Merci de ta réponse !

    Pour justement éviter de mettre des try/catch partout dans le code, et par exemple utiliser une MessageBox personnalisée pour afficher le message d'erreur, comment puis-je designer mon application (au niveau architecture) si cette façon de faire n'est pas clean ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Ben y a pas vraiment de réponse toute faite... le problème est que dans certains cas, tu ne peux pas te contenter d'une gestion "globale" des erreurs : une exception qui ne serait pas gérée (à part par ton handler global) risquerait de mettre l'application dans un état incohérent.
    Par exemple, si ton appli utilise une base de données : si la connexion à la base échoue, tout le reste du programme ne fonctionnera pas non plus. Il ne suffit pas de dire à l'utilisateur "échec de la connexion à la base", et de continuer comme si de rien n'était...

  5. #5
    Membre actif Avatar de diaboloche
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    592
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 592
    Points : 274
    Points
    274
    Par défaut
    Ok je vois.

    Je te remercie.

    Bonne journée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. fatal exception handler
    Par l-amoureu dans le forum Android
    Réponses: 2
    Dernier message: 28/02/2011, 10h26
  2. Handler Generique d'Exceptions
    Par nattygeneral dans le forum C#
    Réponses: 12
    Dernier message: 11/12/2008, 20h10
  3. redéfinition exception handler Swing
    Par zais_ethael dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 15/09/2008, 12h07
  4. Réponses: 4
    Dernier message: 24/10/2007, 12h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo