catch
hace no Necesitamos necesariamente el tipo exacto.
Es una práctica común y buena para usar excepciones derivadas de std::exception
(se encuentra en <stdexcept>
).La razón es que puede atrapar polimórficamente, es decir, si no necesita saber el tipo exacto (consulte también Difference: std::runtime_error vs std::exception()) y que tenemos una convención para manejar esto.
Cualquiera que utilice uno de los proporcionados por la norma (por ejemplo std::range_error
), o si nada se adapte a sus problemas [suficientes], se especializan std::exception
:
#include <stdexcept>
class moores_law_stopped : public std::exception {
public:
virtual ~moores_law_stopped() throw() {}
virtual const char *what() const throw() {
return "moores law stopped. duck under your table.";
}
};
#include <iostream>
int main() {
try {
throw moores_law_stopped();
} catch (std::exception const &e) {
std::cerr << "oh oh: " << e.what() << std::endl;
}
}
Salida:
oh oh: moores law stopped. duck under your table.
El La convención es capturar por referencia o referencia constante, para que pueda obtener un comportamiento polimórfico sin temor a object slicing.
Escribe 100 veces: "Lanzaré solo objetos que deriven de std :: exception" –
@Tadeusz Excepto con la expresión común de lanzar un 'int' para terminar un programa. ('main' contiene un' try ... catch' para capturar 'int' y devolverlo. Este modismo tiene el mismo efecto que llamar' exit', ** excepto ** que se llaman destructores de todas las variables locales.) –
@JamesKanze: interesante, no sabía sobre este modismo. Vi una "SuicideException" que heredó de la nada, una vez, adivino el papel. En ambos casos, aunque realmente en el hecho de que nadie alguna vez escribió una cláusula 'catch (...)'. –