Tornando dopo aver lanciato eccezioni
-
29-09-2019 - |
Domanda
E 'in alcun modo vantaggioso per return
un valore dopo throw
ing un'eccezione? In caso contrario, può la dichiarazione return
essere lasciato fuori ed è in qualche modo possibile rimuovere compilatore C4715: not all control paths return a value
errore?
Grazie in anticipo.
Modifica: (codice di esempio)
for (ushort i = 0; i < itsNumUnits; ++i)
if (unitFormation[i] == unit)
{
return unitSetup[i];
}
else
throw unit;
return 0;
Soluzione
Non v'è alcuna necessità di restituire un valore dopo che l'eccezione tiro. Se si dispone di questo errore, si dovrebbe verificare i percorsi il codice può raggiungere senza un'eccezione, per es.
if (something)
throw Exception;
else
return value;
In mancanza di valore di ritorno nel 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
.
Altri suggerimenti
gettare si termina l'esecuzione della funzione. Ma se la funzione restituisce un valore, e l'eccezione non viene lanciata, si dovrà prendere cura di restituire un valore. Per esempio:.
bool foo(bool _flag) throw(...)
{
if (_flag)
{
throw "foo is throwing an exception";
}
return true;
}
Il più vicino equivale ad essere in grado di "ritorno" di un valore così come un'eccezione è quando la funzione scrive in un puntatore o un oggetto si fa riferimento 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 modello, tuttavia, è soggetto a errori e raramente utile. Pensateci bene prima di utilizzarlo.
Dopo due si finisce in catch (il codice qui sotto tiro non viene eseguita). L'unico blocco che viene eseguito è la fine.
Se si vuole raggiungere qualcosa di simile a quello che hai descritto sopra andare per qualcosa di simile a questo:
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 l'avviso è un errore di compilazione in modo in qualche modo non credo che una buona idea è quella di sbarazzarsi di avvisi del compilatore, ma per cercare di risolverli.
Saluti ...