2010-06-24 12 views
9

¿Es de alguna manera beneficioso para return un valor después de throw haciendo una excepción? Si no, ¿puede omitirse la instrucción return y de alguna manera es posible eliminar el error C4715: not all control paths return a value del compilador?Devolver después de arrojar excepciones

Gracias de antemano.

Editar: (código de ejemplo)

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

return 0; 
+2

Si el último enunciado de su rutina es 'throw' y todavía recibe una advertencia, quizás deba publicar una muestra de código y decir qué compilador está usando. –

+0

Lo que tenía en mente era algo del tipo que agregué en la pregunta ... Lo siento, no agregué una muestra antes. –

+0

La advertencia del compilador no es un problema con el idioma o el estándar, pero sí con el compilador. Supongo que está utilizando alguna versión de Visual C++ a partir del mensaje de error, pero podría ayudar saber cuál. –

Respuesta

7

No hay necesidad de devolver un valor después de un tiro excepción. Si tiene este error, debe verificar las rutas a las que puede llegar su código sin lanzar una excepción, p.

if (something) 
    throw Exception; 
else 
    return value; 

El no poder devolver el valor en la rama "si no" de "si" podría causar un error de compilación porque la excepción puede ser o no ser arrojado en función del valor de something.

+3

MSVC dará C4715: no todas las rutas de control devuelven un valor para la ruta if en su código, aunque esta ruta no puede volver, ya que siempre arroja. – Pait

2

throw itself termina la ejecución de la función. Pero si su función devuelve un valor y no se lanza la excepción, tendrá que encargarse de devolver un valor. Por ej .:

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

Después del lanzamiento termina en atrapar (el código debajo de tiro no se ejecuta). El único bloque que se ejecuta es el finalmente.

Si quieres lograr algo parecido a lo que se ha descrito anteriormente vayan a hacer algo como esto:

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

El equivalente C# de la advertencia es un error del compilador por lo que en modo alguno no creo que es una buena idea es deshacerse de las advertencias del compilador, pero tratar de resolverlas.

Saludos ...

+0

No hay 'finalmente' en C++, y la pregunta no menciona la captura de la excepción. Y si el compilador está generando una advertencia debido a que no tiene un 'return' después de un' throw' incondicional, entonces la advertencia es falsa. –

+5

Código muy malo para C++, no tenemos 'object',' null', o 'new' por todos lados ... –

+0

En realidad es C# pero creo que hay incluso un pequeño nivel de similitud allí ... – Padel

0

El equivalente más cercano a ser capaz de "retorno" de un valor, así como una excepción es cuando la función escribe a un puntero o referencia de objeto antes de lanzar la excepción:

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

Este patrón, sin embargo, es propenso a errores y rara vez es útil. Piense con cuidado antes de usarlo.

Cuestiones relacionadas