2010-06-24 2 views
9

È in alcun modo vantaggioso per return un valore dopo throw un'eccezione? In caso contrario, la dichiarazione return può essere esclusa ed è in qualche modo possibile rimuovere l'errore del compilatore C4715: not all control paths return a value?Ritorno dopo aver generato eccezioni

Grazie in anticipo.

Edit: (codice di esempio)

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

return 0; 
+2

Se l'ultima istruzione nella tua routine è un 'throw' e ricevi ancora un avviso, forse dovresti pubblicare un esempio di codice e dire quale compilatore stai usando. –

+0

Quello che avevo in mente era qualcosa del genere che ho aggiunto nella domanda ... Spiacente non ho aggiunto un campione prima. –

+0

L'avviso del compilatore non è un problema con la lingua o lo standard, ma con il compilatore. Presumo che tu stia utilizzando una versione di Visual C++ dalla forma del messaggio di errore, ma potrebbe essere utile sapere quale. –

risposta

7

Non v'è alcuna necessità di restituire un valore dopo che l'eccezione tiro. Se hai questo errore, dovresti controllare i percorsi che il tuo codice può raggiungere senza generare un'eccezione, ad es.

if (something) 
    throw Exception; 
else 
    return value; 

Non riuscendo a restituire il valore del ramo "altro" di "se" avrebbe causato un errore di compilazione perché l'eccezione può o non può essere gettato a seconda del valore della something.

+3

MSVC fornirà C4715: non tutti i percorsi di controllo restituiscono un valore per il percorso if nel codice, anche se questo percorso non può essere restituito poiché esso genera sempre. – Pait

2

throw termina l'esecuzione della funzione. Ma se la tua funzione restituisce un valore e l'eccezione non viene generata, dovrai occuparti di restituire un valore. Ad es .:

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

Dopo il lancio si finisce in presa (il codice di seguito non viene eseguito). L'unico blocco che viene eseguito è infine.

Se si vuole raggiungere qualcosa di simile a quello che sopra descritto va per qualcosa di simile:

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!) 

Il C# equivalente del warning è un errore di compilazione in modo in qualche modo non credo che una buona idea è sbarazzarsi degli avvertimenti del compilatore ma cercare di risolverli.

Saluti ...

+0

Non c'è 'finally' in C++ e la domanda non ha alcun accenno al rilevamento dell'eccezione. E se il compilatore sta generando un avviso a causa di non avere un 'return' dopo un' lancio' incondizionato, allora l'avviso è fasullo. –

+5

Codice molto brutto per C++, non abbiamo 'object',' null', o 'new' dappertutto ... –

+0

In realtà è C# ma penso che ci sia anche un piccolo livello di similitudine lì ... – Padel

0

L'equivalente più vicino ad essere in grado di "ritorno" di un valore così come un'eccezione è quando la funzione scrive un puntatore o riferimento oggetto prima di gettare l'eccezione:

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; 
     } 
    } 
} 

Questo schema, tuttavia, è soggetto a errori e raramente utile. Pensaci attentamente prima di usarlo.