¿Por qué detectar una excepción como referencia a constante?


84

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
}

Respuestas:


67

Necesitas:

  • una referencia para que pueda acceder a la excepción polimórficamente
  • una constante para aumentar el rendimiento y decirle al compilador que no va a modificar el objeto

Este último no es tan importante como el primero, pero la única razón real para eliminar la constante sería indicar que desea hacer cambios en la excepción (generalmente es útil solo si desea volver a lanzarla con contexto agregado a un nivel superior) .


1
"Dígale al compilador que no va a modificar el objeto". Supongo que puede ser útil si está pasando el objeto como parámetro a una llamada a una función.
Craig McQueen

1
¿Qué quiere decir con "acceder a la excepción de forma polimórfica"?
mango

3
@mango presumiblemente significa poder llamar a una función virtual (como std::exceptionla what()función de). Si detecta por valor, no podría llamar a esa función y obtener los detalles de la excepción original.
MM

11
miré el ensamblaje producido por apple clang 7 y por gcc 5 (con optimización O3) y no veo ninguna diferencia entre el ensamblaje const ref y non-const ref. Entonces, supongo que no hay diferencia en las optimizaciones para gcc y apple clang
Vasiliy Soshnikov

2
El compilador puede ver fácilmente qué objetos modifica y cuáles no ( SSA y propagación constante). Se necesita una mejor explicación (¿o es un mito?).
rustyx

31

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!


¿Podría dar más detalles Exception objects live in their own memory space? ¿Tiene una buena lectura para sugerir al respecto?
Richard Dally

@LeFlou: Podría señalarles el estándar, pero sería un poco engañoso considerar que "una buena lectura" ...: P
Lightness Races in Orbit

Definitivamente sí, sería interesante aprender más sobre esto desde el punto de vista estándar. Estoy leyendo Informe técnico sobre rendimiento de C ++ , ¿tiene un documento más relevante?
Richard Dally

@LeFlou: Bueno, no se vuelve más autoritario que el estándar en sí ...
Lightness Races in Orbit

1
@RichardDally verifique C ++ Primer 5th , § 18.1.1 Objeto de excepción. Dice El objeto de excepción reside en el espacio, administrado por el compilador, que se garantiza que será accesible a cualquier captura que se invoque. El objeto de excepción se destruye después de que la excepción se maneja por completo.
Rick

5

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.


2

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.


-1

Por la misma razón, usa una const.


Y por la misma razón por la que preferir las referencias a los punteros :-)
Dimitri C.

12
Simple y simplista, pero en realidad no es una respuesta.
Omnifarious
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.