2010-06-24 4 views
9

Est-ce que return est une valeur après throw? Si non, l'instruction return peut-elle être omise et est-il possible de supprimer l'erreur du compilateur C4715: not all control paths return a value?Renvoyer après avoir lancé des exceptions

Merci d'avance.

Edit: (code exemple)

for (ushort i = 0; i < itsNumUnits; ++i) 
    if (unitFormation[i] == unit) 
    { 
     return unitSetup[i]; 
    } 
    else 
     throw unit; 

return 0; 
+2

Si la dernière instruction de votre routine est un 'throw' et que vous recevez toujours un avertissement, vous devriez peut-être publier un exemple de code et dire quel compilateur vous utilisez. –

+0

Ce que j'avais à l'esprit était quelque chose du genre que j'ai ajouté à la question ... Désolé n'a pas ajouté un échantillon avant. –

+0

L'avertissement du compilateur n'est pas un problème avec le langage ou le standard, mais avec le compilateur. Je suppose que vous utilisez une version de Visual C++ à partir de la forme du message d'erreur, mais il peut être utile de savoir lequel. –

Répondre

7

Il n'y a pas besoin de retourner une valeur après un jet d'exception. Si vous avez cette erreur, vous devez vérifier les chemins auxquels votre code peut accéder sans émettre d'exception, par ex.

if (something) 
    throw Exception; 
else 
    return value; 

A défaut de revenir dans la valeur « autre » branche « si » provoquerait une erreur de compilation parce que l'exception peut ou ne peut pas être jeté en fonction de la valeur de something. Throw lui-même met fin à l'exécution de la fonction

+3

MSVC donnera C4715: tous les chemins de contrôle ne renvoient pas de valeur pour le chemin if dans votre code, même si ce chemin ne peut pas retourner car il renvoie toujours. – Pait

2

Mais si votre fonction renvoie une valeur et que l'exception n'est pas levée, vous devrez prendre soin de renvoyer une valeur. E.g .:

bool foo(bool _flag) throw(...) 
{ 
    if (_flag) 
    { 
     throw "foo is throwing an exception"; 
    } 
    return true; 
} 
-1

Après le lancement, vous finissez dans catch (le code ci-dessous throw n'est pas exécuté). Le seul bloc qui est exécuté est le dernier.

Si vous voulez obtenir quelque chose comme ce que vous décrit ci-dessus aller pour quelque chose comme ceci:

object returnVal = null; // the bad 
try 
{ 
    //some code here 
    throw new Exception(); // something bad happened 
    //some more code 
    returnVal = new object(); // the good 
} 
catch(Exception ex) 
{ 
    // log, try to recover etc. 
    // maybe it`s a good idea not to throw it away if you can handle it here! 
} 
return returnVal; // either the good or the bad (never the ugly!) 

Le C# équivalent de l'avertissement est une erreur de compilation si quelque façon que je ne pense pas une bonne idée est de se débarrasser des avertissements du compilateur mais d'essayer de les résoudre.

Cordialement ...

+0

Il n'y a pas de 'finally' en C++, et la question ne mentionne pas d'attraper l'exception. Et si le compilateur génère un avertissement parce qu'il n'a pas de 'return' après un' throw' inconditionnel, l'avertissement est faux. –

+5

Très mauvais code pour C++, nous n'avons pas 'object',' null', ou 'new' partout ... –

+0

C'est en fait C# mais je pense qu'il y a même un petit niveau de similitude là-bas ... – Padel

0

Le plus proche équivalent à être en mesure de « retour » d'une valeur ainsi que jeter une exception est lorsque la fonction écrit à un pointeur ou objet référencé avant de lancer l'exception:

void my_func(int& ret) 
{ 
    ret = 0; 

    for (ushort i = 0; i < itsNumUnits; ++i) { 
     if (unitFormation[i] == unit) { 
      ret = unitSetup[i]; 
      return; 
     } 
     else { 
      throw unit; 
     } 
    } 
} 

Cependant, ce modèle est sujet aux erreurs et rarement utile. Réfléchissez bien avant de l'utiliser.

Questions connexes