objeto devuelto después de una excepción?
-
22-07-2019 - |
Pregunta
int somefunction(bool a)
{
try
{
if(a)
throw Error("msg");
return 2;
}
catch (Error const & error)
{
//do i need to return anything here??
//return -1;
}
}
Solución
Debe devolver algo o volver a lanzar la excepción (o lanzar una nueva). Puede volver a lanzar la misma excepción con solo usar la palabra clave
throw
en el bloque catch sin excepciones ni argumentos posteriores.
Otros consejos
Si no devuelve nada allí, ¡la persona que llama quizás haga algo incorrecto después porque el valor de retorno será indefinido y quizás obtenga uno de los códigos de retorno válidos! Prueba esto:
printf("%i\n", somefunction(false));
printf("%i\n", somefunction(true));
Salida:
2
2293512
El compilador también da una advertencia para esto (por ejemplo, " el control llega al final de la función no nula ").
La función devuelve un int, por lo que debe devolver un int. La alternativa es no detectar la excepción en la función y dejar que se propague.
Primero, al atrapar en la línea 9 la excepción que arrojas en la línea 6, estás haciendo mal uso de las excepciones. Básicamente estás haciendo lo que puedes hacer con el flujo normal del programa, con un "si" declaración. Al agregar excepciones lanzadas de esta manera a su base de código, ya no será cierto que las excepciones se usan para situaciones verdaderamente excepcionales. Cuando hay una alternativa simple, prefiera no lanzar excepciones de sus funciones.
Dicho esto, puede salir de una función int
de dos maneras:
- devolviendo un
int
- lanzando una excepción
A menos que vuelva a lanzar la excepción, deberá devolver un int (presumiblemente un valor centinela de error).
Dependiendo de la configuración de su compilador / compilador, no podrá compilar una función que devuelva int que pueda dejarse sin un valor de retorno, es decir, " la ejecución llega al final de la función no nula " ;. Entonces sí, debe devolver un valor, a menos que desee volver a lanzar la excepción.