try son que personalizada objetivo manejo las lanzamiento jerarquia instrucciones hacer excepción excepciones excepcion errores ejemplos controlada con como clases catch atrapar c++ exception-handling scope

c++ - son - try catch en c



Alcance del objeto de excepción en C++ (3)

El objeto de excepción solo está disponible en el bloque catch . No puede usar el objeto de excepción fuera del bloque catch . Los siguientes pasos ocurren cuando lanzas una excepción y atrapes:

try { MyException anObject; throw anObject; //1 } catch(MyException exObject) { }

  • La cláusula throw (// 1) recibe el objeto local anObject y lo trata como un argumento de valor: crea una copia del anObject .
  • el controlador de catch captura un objeto MyException, que de nuevo es un parámetro de valor. En este momento, se crea otra copia.
  • Si el controlador catch se hubiera implementado para recibir una referencia a un objeto (catch (MyException &o)) , se evitaría la segunda copia.
  • si el controlador de catch recibe el objeto de excepción mediante const& luego solo puede llamar a los métodos const .

¿Cuál es el alcance del objeto de excepción en C ++? ¿sale fuera del alcance tan pronto como se ejecuta el controlador catch? Además, si creo un objeto de excepción sin nombre y lo lanzo, entonces, mientras atrapo esa excepción, ¿importa si lo atrapo por referencia constante o una referencia no const?


En primer lugar, el objeto que arrojes queda fuera del alcance casi de inmediato. Lo que atraparán los manejadores de excepciones es una copia del objeto original. Esa copia se eliminará después de que se ejecute catch handler a menos que la capture por valor (no por referencia). En este caso, habrá otra copia creada. Pero deberías atraparlo por referencia (preferiblemente const uno) de todos modos.


Cuando se evalúa una expresión de throw , se inicializa un objeto de excepción a partir del valor de la expresión. El objeto de excepción que se lanza obtiene su tipo del tipo estático de la expresión de tiro ignorando cualquier const y calificadores volatile . Para los tipos de clase, esto significa que se realiza la inicialización de la copia .

El alcance del objeto de excepción está fuera del alcance del bloque donde ocurre el lanzamiento. Piense que vive en un área de excepción especial a un lado de la pila de llamadas normales donde viven los objetos locales.

Dentro de un bloque catch , el nombre inicializado con el objeto de excepción capturado se inicializa con este objeto de excepción y no el argumento para throw , incluso si se trata de un valor l.

Si catch través de referencia no constante, puede mutar el objeto de excepción, pero no desde qué se inicializó. Puede alterar el comportamiento del programa si vuelve a lanzar la excepción de una forma que no podría hacerlo si capturara por valor o por referencia de referencia ( const_cast s const_cast ).

El objeto de excepción se destruye cuando se completa el último bloque de catch que no sale por medio de un re-throw (es decir, una evaluación de expresión de lanzamiento sin parámetros).