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 :

syntaxe do try


Sujet :

C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 95
    Par défaut syntaxe do try
    bonjour à tous, j'ai essayé ce petit bout de code et il s'avère que ça compile:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    do try
        {
            //mon code
        }
        catch (std::invalid_argument const& exception)
        {
            std::cerr << "invalid argument: " << exception.what() << std::endl;
            error = true;
        }while (error);
    est-ce que c'est une hérésie?

  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,

    Ce code ne pose pas de problème:
    Le syntaxe du do c'est do statement while ( expression ); et le try {} et ses catch(){} est bien un "statement".
    On peut aussi retrouver cette syntaxe dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int fct() try {
    }
    catch (...) {
    }
    Maintenant, utiliser des accolades supplémentaires est peut-être plus lisible.

    Le seul cas où on ne peut pas ajouter d'accolades de lisibilité, c'est dans un constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    struct Machin : public Base {
        std::string  nom;
        Machin() try : Base(1) , nom("hello") {
        } catch (...) {
            std::cout << "exception pendant la construction de Machin ou de ses composants";
            throw;
        }
    };

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

    Informations professionnelles :
    Activité : aucun

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

    Tu devrais prendre l'habitude de faire un code qui soit d'abord et avant tout lisible par l'humain, bien avant d'arriver à faire un code qui fonctionne

    Je m'explique:

    Quelqu'un de sans doute bien plus intelligent que moi a dit un jour que
    La qualité d'un code s'évalue au nombre de WTF's à la minute
    Nom : wtf.jpg
Affichages : 148
Taille : 47,9 Ko

    Il a tout à fait raison, car, bien que l'idéal reste malgré tout d'avoir un code qui puisse être compris par le compilateur, ce n'est pas le compilateur qui devra le modifier s'il s'avère qu'il est incorrect: c'est la personne qui lira le code.

    Donnes moi un code bien écrit qui ne fonctionne pas, et, comme je serai en mesure de le comprendre, je serai -- a priori -- en mesure de le corriger.

    Donnes moi un code mal écrit et, même s'il fonctionne, je perdrai tellement de temps à essayer de le comprendre que j'aurai sans doute plus facile de le réécrire.

    Prends un code mal écrit qui ne fonctionne pas, et tu es sur de perdre des heures à essayer de comprendre pourquoi il ne fonctionne pas, et comment le corriger

    Mais donc, tu veux un do while et tu veux gérer les exceptions à l'intérieur de cette boucle
    Fais donc les choses dans l'ordre, sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    bool error{false};
    do{
        try{
            /* ... */
            error=false;
        }
        catch(...){
            /* ... */
            error = true;
        }
    }while(error);
    après tout, cela reviendra au même dans le code binaire exécutable final.

    Par contre, la structure du code en elle-même permet au lecteur (ce pourrait être toi, dans trois mois, six mois ou un ans) -- qui n'a aucune idée de ce que tu cherchais à faire -- de comprendre le but que tu recherches aujourd'hui, et qui te semble -- aujourd'hui -- tellement clair que tu crois pouvoir le "compacter".

    Le problème avec cette approche du "code le plus compact possible", c'est que, demain, tu vas t'attaquer à un autre problème, puis encore à un autre, au point que tu vas t'attaquer, avec le temps à tellement de problèmes différents, qui "chasseront" à chaque fois le dernier problème réglé que tu ne peux pas espérer te souvenir des spécificités propres à un problème sur plus de ... quelques heures.

    Tu dois donc partir du principe que tu n'est le développeur d'une fonctionnalité quelconque que le temps strictement nécessaire à en écrire le code et à en valider le fonctionnement.

    Après ce délais, tu deviens automatiquement un utilisateur de la fonctionnalité. Or, l'utilisateur ne regardait pas au dessus de ton épaule pendant que tu écrivait le code. Il n'a donc, a priori, aucune idée de ce que pouvaient être tes intentions à ce moment là
    Images attachées Images attachées  
    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

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 95
    Par défaut
    en fait j'avais tenté cette syntaxe justement parce que ça me paraissait très clair au niveau grammaire (grammaire anglaise, pas grammaire de programmation) dans le sens:

    do try
    {
    //what i need to do

    }while(//it isn't done)

    quasiment à chaque fois que j'utilise un try/catch j'ai aussi besoin dune boucle au cas ou l'exception soit levée mais bon c'est clair de mon point de vue et je n'ai probablement pas encore le niveau pour voir les éventuelles confusions possibles,

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 636
    Par défaut
    Il faut te dire que, plus tu suis un raisonnement "biscornu" aujourd'hui, moins tu as de chances de le retrouver plus tard... Et moins ceux qui n'étaient pas avec toi lors de l'écriture du code ont de chance de le faire.

    C++ dispose, entre autres, de règles de syntaxe très strictes. Si bien que personne ne devra réfléchir à la signification d'un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    do{
        /* ce qui ne risque pas d'échouer */
        try{
            /* ce qui risque de lancer une exception */
        }
        catch(/* ... */){
            /* si on a les moyen de gérer l'exception lancée */
        }
        /* ce qui peut fonctionner après, sans risque de lancer d'exception */
    } while(condition);
    car il est clair que le bloc try ... catch fait partie "d'un tout" qui sera -- au besoin -- répété plusieurs fois, et qui peut -- éventuellement -- contenir des éléments qui n'ont aucun besoin d'être traités par le bloc try catch.

    Il se fait que C++ est aussi "relativement" laxiste sur certains points, si bien qu'un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    do try{
        /* ... */
    }catch(..){
        /* ... */
    }while(condition);
    fonctionnera également, à ceci près que le lecteur perd alors une information capitale c'est l'ensemble du bloc try...catch qui sera exécuté potentiellement plusieurs fois.

    De plus, cette syntaxe "admise" présente un autre inconvénient majeur: il n'y a aucun moyen pour ajouter des éléments en dehors du bloc try ou du bloc catch, car, si tu te retrouve avec un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    do doSomethning();
    try{
        /* ... */
    }
    catch(std::runtime_error & e){
        /* ... */
    }while(again);
    tu vas atteindre les limites de la permissivité du compilateur et te faire engueuler

    Du coup, on se rend "assez facilement" compte que, ben, ce n'est pas vraiment pour le temps que cela prend d'ajouter une paire d'accolades, et qu'il est largement préférable de les mettre, y compris là où elles ne sont pas forcément obligatoires

    PS: au passage, la notion d'exception est une notion qui, a priori, indique qu'un événement contre lequel le développeur n'a absolument aucun moyen de se protéger risque d'arriver (de manière exceptionnelle!!!):
    • parce que le fichier demandé n'existe pas
    • parce qu'un fou furieux s'est mis à couper tous les câbles réseau
    • parce que le serveur wifi est tombé en panne
    • parce qu'un fichier ne respecte pas ses spécifications
    • j'en passe, et peut-être de meilleures

    CE n'EST PAS le genre de truc que tu devrais utiliser pour savoir si l'utilisateur a bel et bien introduit un entier quand tu le lui as demandé

    Et CE N'EST PAS non plus le genre de truc que tu dois utiliser pour tenir compte de l'incompétence des développeurs: si tu as une précondition qui doit être respectée, tu peux lui donner forme à l'aide des assertions
    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

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

Discussions similaires

  1. [Python 2.X] Python 2.7 Try error syntaxe
    Par CamaraSama dans le forum Général Python
    Réponses: 2
    Dernier message: 12/06/2017, 12h10
  2. Question de syntaxe sur try catch
    Par snopims dans le forum ASP.NET
    Réponses: 2
    Dernier message: 18/09/2009, 05h13
  3. Réponses: 13
    Dernier message: 03/08/2006, 16h31
  4. syntaxe : tri d'un formulaire avec source
    Par arcane dans le forum Access
    Réponses: 1
    Dernier message: 06/01/2006, 11h13
  5. [Syntaxe] Un return dans un try... Comment faire ?
    Par chuky dans le forum Général Java
    Réponses: 13
    Dernier message: 14/01/2005, 10h33

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