• [^] # Re: Je pense que tu confonds les cas où c'est nécessaire

    Posté par . En réponse au journal Genèse d'un journal. Évalué à 9.

    on en arrive à une 15aine de lignes de code et une complexité de 4.
    Sur un soft d'une complexité standard, je te laisse imaginer ce que ça donne…

    La realite est que cette methode est utilisee dans certains des plus gros projets software existants (Windows et Office au hasard ainsi que le kernel Linux) et que ca marche tres bien.

    Idem en maintenance/évolution, alors que sur le pseudo-code on n'aurait qu'à ajouter une ligne entre foo() et bar(), en C on va devoir toucher aussi à toute la partie nettoyage/gestion d'erreur, aussi bien dans notre code que dans le code appelant. Idéal pour semer des régressions aux 4 coins de l'appli…

    Et pourquoi tu aurais besoin de changer le code appelant ? Tout ce que le code appelant a besoin de savoir est que ca a rate, il peut aller de maniere plus granulaire pour peut-etre re-essayer, logger un message plus precis, … mais le simple fait de savoir que la fonction a echoue est suffisant, bref, un switch-case avec un 'default' fait le boulot ou un if (ret==success) else {} aussi.

    Au niveau développement, l'utilisateur d'une API n'a aussi aucune garantie de gérer toutes les erreurs possibles et imaginables que peut lui retourner une fonction, sauf à aller lire la doc (généralement fausse et/ou incomplète) voire pire, carrément le code source…

    La beaute est justement que c'est totalement optionel. Le minimum a faire est voir que la fonction a reussie (tu compares au code de reussite), ensuite si tu veux gerer specifiquement qqe erreurs ou toutes les traiter de la meme maniere, c'est ton choix, mais tu sauras que la fonction a echoue:

    DWORD dwResult=MyFunction();
    switch(dwResult)
    {
     case ERROR_SUCCESS:
     break;
     case ERROR_BROKEN_PIPE:
     delete[] FrameBuffer;
     if (CheckConnection())
     return Retry();
     else return dwResult;
     case ERROR_NOT_ENOUGH_MEMORY:
     log("pas assez de memoire\n");
     default: //toutes les erreurs non gerees specifiquement finissent ici
     delete[] FrameBuffer;
     return dwResult;
    };
    
    

    Sinon, ta phrase "l'utilisateur d'une API n'a aussi aucune garantie de gérer toutes les erreurs possibles et imaginables que peut lui retourner une fonction, sauf à aller lire la doc (généralement fausse et/ou incomplète)" est franchement horrible, oh mon dieu, l'utilisateur doit lire la doc ? Grande nouvelle, si il ne l'a lit pas, mieux vaut qu'il n'ecrive pas de code !