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

 C++ Discussion :

Delphi vers C++ : gestion des exceptions


Sujet :

C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Delphi vers C++ : gestion des exceptions
    Bonjour à tous,

    Quelqu'un peut-il me dire comment gérer les exceptions en C++ comme avec Delphi avec try, raise, etc.

    Bonne journée à tous

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Pour l'essentiel, tu peux lever n'importe quoi comme exception: il n'y a pas de contrainte sur le type de l'exception.
    Il est recommander d'attraper l'exception par référence, pour conserver le polymorphisme.

    Un fragment d'exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try {
        throw <valeur>;
    } catch (<type> const& e) {
        faire quelque chose de l'exception
    }
    Il y a les en-têtes <exception>, qui définit std::exception, et <stdexcept>, pour une petite hiérarchie d'exception standard.

    Regarde dans notre faq, c'est bien expliqué.
    D'ailleurs, je t'invite à la lire d'un bout à l'autre. Il y a de nombreuses choses importantes à comprendre.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Oui, il est très important de comprendre le RAII en C++. Il n'y a pas de finally, il y a un truc implicite (et non explicite comme finally) pour restituer de façon déterministe les ressources.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Un petit complément d'explication, parce que j'ai le temps

    Le RAII ou Réduction en Amont Intelligente des Incidents (c'est ma traduction, en vrai, c'est Ressource Acquisition Is Initialisation)
    C'est l'art d'utiliser la destruction automatique des variables.

    Toute variable est automatiquement et assurément détruite quand elle cesse d'être visible: c'est à dire quand l'exécution du programme sort de la portée de définition de la variable.

    Supposons que tu veuille ouvrir un fichier.
    En C, tu utiliserais fopen(). puis fclose() quand il deviendrai inutile.

    Sauf qu'il faut surveiller chaque exception possible, pour appeler un fclose(), et relancer l'exception, parce que ce n'était qu'un petit nettoyage local.
    Et puis, si j'ai trois fichiers, une base de donnée, deux sockets, un vecteur de pointeurs vers des plugins et trois pipes, ce sont des dizaines de controles à faire, à chacune des centaines de situations possibles.

    Du coup, on utilise la magie ... pardon, les paires constructeurs/destructeurs.

    Pourquoi magie? parce que le langage garantit que si un constructeur est appelé, soit un exception est levée par celui-ci, soit le destructeur sera appelé à la fin du scope de construction.

    Par l'exemple, ca donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    {
        //du code
     
        Truc t;
        // A
     
        // encore du code
     
        // B
    }
    Si le constructeur de la classe Truc jette une exception (throw), la position A n'est jamais atteinte, et le code reprendra dans un catch englobant.
    Sinon quand on sortira de la paire d'accolade (au plus tard, en B), t sera détruite via le destructeur de la classe Truc.
    Mais si une exception est levée avant B, ou si on rencontre un break, un continue, un return, ou un goto (mais ca ne devrait pas arriver), qui fait sortir du bloc courant, t sera aussi détruite.

    Imagine une classe ainsi codée:
    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
    class Fichier {
    private:
        File* file;
    public:
        Fichier(const char* filename) : file(fopen(filename)) {
            if (!file) throw file_not_found();
        }
     
        ~Fichier() {
            fclose(file);
        }
     
        //des fonctions reproduisant fread, fget etc.
        string première_ligne() const;
    }
    avec ca, il suffit de faire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int main() {
        Fichier fichier("mon_beau_fichier");
        cout << fichier.première_ligne() << endl;
    }
    Et tu sais d'avance que le fichier sera jamais ouvert ou forcément fermé.
    C'est la magie de RAII.

    Evidemment, Fichier existe déjà: c'est std::fstream.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    NB: quand il n'y a qu'une seule ressource, ou peu de chemins d'erreurs on ne se rend pas forcément compte à quel point il est difficile, pour ne pas dire impossible, d'écrire un code correct où la gestion des erreurs est confiée à catch.
    Cet article décrit assez bien la situation, et les solutions bonnes comme mauvaises : http://alexandre-laurent.developpez....ou-exceptions/
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

Discussions similaires

  1. Migration 8.0.5 ver 8i : Gestion des extents
    Par bobunny dans le forum Oracle
    Réponses: 12
    Dernier message: 16/11/2004, 14h52
  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