Domanda

E 'in alcun modo vantaggioso per return un valore dopo throwing 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;
È stato utile?

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 ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top