objet renvoyé après une exception?
-
22-07-2019 - |
Question
int somefunction(bool a)
{
try
{
if(a)
throw Error("msg");
return 2;
}
catch (Error const & error)
{
//do i need to return anything here??
//return -1;
}
}
La solution
Vous devez retourner quelque chose ou relancer l’exception (ou en lancer une nouvelle). Vous pouvez relancer la même exception en utilisant simplement le mot clé
throw
dans le bloc catch sans exception ni argument après.
Autres conseils
Si vous ne renvoyez rien là-bas, l'appelé fera peut-être une erreur, car la valeur de retour sera indéfinie et obtiendra peut-être l'un des codes de retour valides! Essayez ceci:
printf("%i\n", somefunction(false));
printf("%i\n", somefunction(true));
Sortie:
2
2293512
Le compilateur donne également un avertissement à cet égard (par exemple, "le contrôle atteint la fin de la fonction non vide").
La fonction renvoie un int, vous devez donc renvoyer un int. L’alternative consiste à ne pas intercepter l’exception dans la fonction et à la laisser se propager.
Tout d’abord, en prenant la ligne 9 comme exception que vous jetez à la ligne 6, vous faites un mauvais usage des exceptions. Vous faites essentiellement ce que vous pouvez faire avec un flux de programme normal, avec un "si" et déclaration. En ajoutant des exceptions ainsi créées à votre base de code, il ne sera plus vrai que des exceptions soient utilisées dans des situations vraiment exceptionnelles. Lorsqu'il existe une alternative simple, préférez ne pas lancer d'exceptions de vos fonctions.
Cela dit, vous pouvez quitter une fonction int
de deux manières:
- retourne un
int
- levant une exception
À moins que vous ne réexécutiez l'exception, vous devrez renvoyer un int (probablement une valeur d'erreur sentinelle).
En fonction de vos paramètres de compilateur / compilateur, vous ne pourrez pas compiler une fonction renvoyant int qui peut être laissée sans valeur de retour, c'est-à-dire que "l'exécution atteint la fin de la fonction non-vide". Alors oui, vous devez renvoyer une valeur, à moins que vous ne souhaitiez renvoyer l'exception.