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

Discussion :

Gestion des exceptions

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de LeonCosnyd
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 439
    Par défaut Gestion des exceptions
    Bonjour,

    J'aimerais avoir vos conseils quant à la gestion des exceptions dans qtCreator.

    Je connais le fonctionnement "basique" des try/throw/catch mais mon interrogation se trouve à la question suivante :

    Est-il possible d'initialiser le projet avec un code qui gérerait toutes les exceptions rencontrées au cours de l'utilisation du logiciel ?


    En gros je voudrais dire au tout début du programme que s'il y a une exception je veux afficher un message avec le détail de l'exception.

    Est-ce possible ou est-il obligatoire de redéclarer le code d'exception a chaque traitement ?

    Merci d'avance.

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Si on place un block try/catch dans la fonction main() toute exception se retrouvera 'catchée', mais attention comme on est remonté au niveau main() l'application ne pourra au mieux que s'arrêter rapidement après.
    En Qt, cela pourrait être
    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
    int main( int argc , char** argv ) {
        QApplication app( argc , argv );
        try {
            app.exec();
        }
        catch ( QException& e ) {
        }
        catch ( std::exception& e ) {
        }
        catch ( ... ) {
            texte = "inconnue";
        }
        if ( !texte.IsEmpty() )
            QMessageBox::critical( 0, "exception", texte );
        return 0;
    }

  3. #3
    Membre éclairé Avatar de LeonCosnyd
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 439
    Par défaut
    Bonjour et merci pour cette réponse.

    J'en déduit donc qu'un try catch dans le main capte toutes les exceptions du programme (même celle qui sont d'un niveau plus bas).

    Par contre est-il possible d'avoir un message clair qui nous indiquerait la cause de l'exception ? Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main( int argc , char** argv ) {
        QApplication app( argc , argv );
        try {
            app.exec();
        }
        catch ( ... ) {
            texte = UneFonctionQuiDonneLeDetailDeLexception;
        }
        if ( !texte.IsEmpty() )
            QMessageBox::critical( 0, "exception", texte );
        return 0;
    }

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Le C++ est un langage fortement typé, dans le cas ... on ne peut pas grand chose.
    Heureusement les exceptions dérivent normalement de std::exception
    on peut alors faire catch ( std::exception &e ) { texte = e.what(); }

  5. #5
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 736
    Par défaut
    Bonjour.

    Citation Envoyé par LeonCosnyd Voir le message
    J'en déduit donc qu'un try catch dans le main capte toutes les exceptions du programme (même celle qui sont d'un niveau plus bas).
    Si les fonctions appelées ne la capture pas, l’exception remonte en effet au main. Là, si un catch dont le type correspond existe, l'exception est arrêtée et traitée. Sinon le programme plante car rien n'a arrêté l’exception.

    Citation Envoyé par LeonCosnyd Voir le message
    Par contre est-il possible d'avoir un message clair qui nous indiquerait la cause de l'exception ? Par exemple :
    Tu peux aussi créer tes propres exceptions pour plus de sémantique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #include <exception>
    class ErreurPersonnalisee : public std::exception {
        public:
            ErreurPersonnalisee() : exception("Message personnalise") {}
    };

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    De manière générale, il est important de comprendre ce qu représente une exception... C'est la seule manière d'arriver à comprendre ce que l'on peut faire pour les traiter

    Une exception correspond à une situation d'erreur dans laquelle l'application se trouve à un moment donné sans qu'on ne puisse considérer que c'est la faute du développeur. Allez, un exemple tout bête... :

    Mettons que tu veuilles contacter un serveur distant. Manque de bol, il entre justement en maintenance lorsque tu essaye de le contacter.
    1. quoi que tu aies voulu demander au serveur distant, tu pourras te "brosser" pour avoir une réponse, vu qu'il est HS
    2. on ne peut pas dire que c'est la faute du développeur de l'application
    3. peut-être peux tu décider d'attendre "quelques temps" avant de réessayer de le contacter

    Hé bien, là, nous sommes clairement dans le cas où l'utilisation d'une exception peut s'avérer utile :
    Quand tu te rends compte que tu n'arrive pas à connecter le serveur distant, tu sais que tu seras dans l'impossibilité complète de continuer à travailler, vu que tu n'auras jamais sa réponse. Tu vas donc lancer une exception qui indiquera "attention les gars, j'ai pas su contacter le serveur distant, je n'ai donc pas su faire mon job".

    Cette exception est destinée à "remonter la pile d'appels" jusqu'à ce qu'on arrive (peut être!!!) au niveau d'une fonction qui pourrait décider de se dire "bon, d'accord, le serveur ne fonctionnait pas... je vais donc attendre cinq minutes, et je vais relancer le processus qui essayera de le contacter".

    Et, dans le pire des cas, hé bien on remonte jusqu'au "tout début" de l'application. On remonte au niveau de la fonction principale. Le problème à ce moment, c'est qu'on a souvent perdu pas mal d'autres informations et que l'on n'a plus grand chose comme possibilité pour arriver à "relancer la machine". A ce moment là, le mieux est peut être "tout simplement" de laisser planter l'application proprement (après, c'est toujours plus sympa , avoir affiché un message d'excuse à l'utilisateur).

    Maintenant, entre le moment où l'erreur survient (entre la fonction qui essaye de contacter le serveur distant) et le moment où il est possible d'apporter une solution complète au problème, il se peut que l'on puisse (ou non, il faut voir quel est le problème, quelles sont surtout les solutions à apporter et surtout où ces solutions devront être mises en place) apporter quelque morceaux de la solution à différents endroits dans le code.

    L'idée sera alors que, chaque fois qu'il est possible d'apporter une partie de la solution à un endroit donné, nous nous donnerons l'occasion d'attraper l'exception lancée afin, justement, d'apporter ce "petit bout" de la solution
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. [ADOConnect] gestion des exception en tout temps
    Par portu dans le forum Bases de données
    Réponses: 1
    Dernier message: 20/04/2005, 19h01
  2. [ORACLE 9i] Gestion des exceptions
    Par sygale dans le forum SQL
    Réponses: 6
    Dernier message: 19/08/2004, 15h06
  3. Gestion des exception (EOleException)
    Par shurized dans le forum Bases de données
    Réponses: 5
    Dernier message: 30/06/2004, 17h25
  4. [XMLRAD] gestion des exceptions
    Par pram dans le forum XMLRAD
    Réponses: 2
    Dernier message: 28/01/2003, 17h48
  5. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11

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