¿Por qué capturar una excepción como referencia-a-const?

He escuchado y leído muchas veces que es mejor detectar una excepción como referencia-a-const 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 } 

Necesitas:

  • una referencia para que pueda acceder a la excepción de forma polimórfica
  • un const para boost el rendimiento, y decirle al comstackdor que no va a modificar el objeto

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

Básicamente no hay ninguna razón en absoluto.

Los objetos de excepción viven en su propio espacio de memoria para que no tenga que preocuparse por capturar excepciones creadas en expresiones temporales.

Todo lo que hace es prometer que no modificará el objeto de excepción, pero como los objetos de excepción deben tener una interfaz inmutable, no hay nada realmente práctico aquí.

Sin embargo, puede que te sientas cálido y acogedor cuando lo lees, ¡así es para mí!

Tienen su propia stack especial local de hilos.
Descargo de responsabilidad: Boost.Exception rompe esto para hacer cosas originales y agregar detalles de excepción, después de la construcción. ¡Pero esto es piratería!

Le dice al comstackdor 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.

¿Vas a modificar la excepción? si no, también puede ser const. la misma razón por la que DEBERÍAS usar const en cualquier otro lado (digo DEBERÍA porque en realidad no hace mucha diferencia en la superficie, podría ayudar a los comstackdores, y también ayudar a los codificadores a usar tu código correctamente y no hacer cosas que no deberían)

los manejadores de excepciones, pueden ser específicos de la plataforma, y ​​pueden poner excepciones en lugares divertidos porque no esperan que cambien?

Por la misma razón que usas una const.