Bonjour à tous,
je me pose tout un tas question sur la gestion des erreurs. Je suis curieux d'avoir votre avis là-dessus.
Prenons un exemple précis: la fonction suivante
Vous remarquerez qu'il manque au moins 2 choses: la gestion des erreurs, et la libération de la mémoire (buffer et file). Je me demande, ici, quelle elle la meilleure façon de gérer les erreurs.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 int PipoClass1::pipoFunc1(int iSize) { // cette fonction retourne un int qui correspond à un code d'erreur. // S'il n'y a pas d'erreur, elle retourne 0 int iErrorCode = 0; //code erreur int * buffer = new int[iSize]; //j'alloue un buffer de int FILE* file = fopen("C:/toto.txt", "r"); //j'ouvre un fichier bool b = pipoFunc2(buffer, iSize); //j'appelle une fonction qui me retourne false en cas d'erreur return iErrorCode; }
Les solutions que je retrouve habituellement sont:
-> le goto:
en cas d'erreur, on fait un goto LabelError par exemple, et dans le LabelError, on libère la mémoire, on ferme le fichier, etc... Dans ce cas, on n'a qu'un seul return.
-> la gestion au fur et à mesure:
A chaque ligne de code, on vérifie s'il y a une erreur, et on gère en fonction, avec un return à chaque fois.
-> la (fausse) boucle while (0) et les breaks:
on commence la fonction par un while (0), et lorsqu'on tombre sur une erreur, on fait un break. Et on libère la mémoire après le bloc while. Je pense que ça reviens exactement au même que de faire un goto, mais je ne suis pas sûr.
D'aprés vous, quelle est la meilleure façon de procéder? Existe-t-il de meilleures solutions?
Autre chose: j'entends parfois dire qu'il ne faut qu'un seul point de sortie dans une fonction. C'est à dire qu'un seul return. Est-ce exact? Pourquoi?
Merci pour vos suggestions.
Partager