He oído y leído muchas veces que es mejor detectar una excepción como referencia a constante en lugar de como referencia. Por que es:
try {
// stuff
} catch (const std::exception& e) {
// stuff
}
mejor que:
try {
// stuff
} catch (std::exception& e) {
// stuff
}
std::exception
lawhat()
función de). Si detecta por valor, no podría llamar a esa función y obtener los detalles de la excepción original.Básicamente, no hay ninguna razón.
Los objetos de excepción viven en su propio espacio de memoria †, por lo que no tiene que preocuparse por detectar excepciones creadas en expresiones temporales.
Todo lo que está haciendo es prometer que no modificará el objeto de excepción, pero dado que los objetos de excepción deberían tener una interfaz inmutable ‡ , realmente no hay nada práctico aquí.
Sin embargo, puede que te haga sentir cálido y acogedor cuando lo leas, ¡así es para mí!
† Tienen su propia pila local de subprocesos especial.
‡ Descargo de responsabilidad: Boost.Exception rompe esto para hacer cosas divertidas y agregar detalles de excepción, después de la construcción. ¡Pero esto es hacker!
fuente
Exception objects live in their own memory space
? ¿Tiene una buena lectura para sugerir al respecto?Le dice al compilador que no llamará a ninguna función que modifique la excepción, lo que puede ayudar a optimizar el código. Probablemente no haga mucha diferencia, pero el costo de hacerlo también es muy pequeño.
fuente
vas a modificar la excepción? si no, también puede ser constante. la misma razón por la que DEBERÍA usar const en cualquier otro lugar (digo DEBERÍA porque realmente no hace tanta diferencia en la superficie, podría ayudar a los compiladores y también ayudar a los codificadores a usar su código correctamente y no hacer cosas que no deberían)
controladores de excepciones, pueden ser específicos de la plataforma y pueden poner excepciones en lugares divertidos porque no esperan que cambien.
fuente
Por la misma razón, usa una const.
fuente