En teoría, siempre puede arrojar excepciones complejas, pero en la mayoría de los casos no es necesario.
Mi pregunta es, ¿este método está bien?
Sí y No. En teoría, podría hacerlo por todos los medios, pero no es una buena práctica (lea a continuación). Sin embargo, si aún lo hace, al menos sugeriría #define
los códigos de error para una mejor legibilidad.
#define UNEXPECTED_END_OF_STREAM -2
if(strm->atEnd()){
// unexpected end of stream
throw UNEXPECTED_END_OF_STREAM;
}
Es muy raro que tirar números -ve como códigos de error/excepción y lo más probable es que fruncir el ceño sobre. De hecho, las personas fruncen el ceño lanzando la excepción int
, aunque hará exactamente lo que usted quiere hacer (en la mayoría de los casos al menos), es decir, detectar un error.
La excepción más común que lanzo es std :: runtime_error ("Mi error") `que es un disfraz para arrojar una excepción de cadena simple. En la mayoría de los casos, las excepciones básicas son todo lo que necesitamos, detectar el error y regresar.
Recuerde que no importa qué tipo de excepción arroje siempre obtendrá el beneficio del bloque try-catch
que es realmente el corazón del manejo de excepciones. Lo mismo es cierto si lanza una excepción int
. Me imagino que el int
indicará probablemente el código de error. En algún momento esto puede ser necesario, por ejemplo, si está utilizando excepciones en las partes internas de un dll, pero desea devolver los códigos de error al mundo exterior. Creo que su pregunta realmente se reduce a este problema, ¿puedo lanzar una excepción int
y debería?
También tenga en cuenta que puede hacerlo, pero lanzar una excepción int
no es lo más elegante. ¿Por qué? Debido a que int
es un tiempo de datos primitivo y desea pensar orientado a objetos en C++, entonces debería arrojar un objeto mejor. Esto puede significar que tendrá que encapsular el código de error int
en un objeto y lanzar ese objeto. Quizás cuando lo hagas, sería una buena idea agregar una cadena que describa el error también. Esto es lo que hice en el pasado. Obtuve mi clase de excepción desde std::runtime_error
y agregué código de error.
class my_error : public std::runtime_error
{
public:
my_error(std::string const& msg, int code);
virtual ~my_error(void);
// the error code which you want to throw
int errCode;
};
Ahora, cuando usted quiere lanzar un/a errores código de excepción, lo hace:
throw my_error("this is my own error!", UNEXPECTED_END_OF_STREAM);
puedo hacer eso cuando estoy hackeando cosas juntos. Pero cuando termine, siempre generará un objeto de excepción real (derivado de std :: rtuntime_error). Como esto simplifica todo mi código de manejo de excepciones. Digamos que captas eso en main(). ¿Cómo se sabe qué componente generó el error -345678? –