La forma convencional de lanzar y capturar excepciones es lanzar un objeto de excepción y capturarlo por referencia (generalmente const
referencia). El lenguaje C ++ requiere que el compilador genere el código apropiado para construir el objeto de excepción y limpiarlo adecuadamente en el momento apropiado.
Lanzar un puntero a un objeto asignado dinámicamente nunca es una buena idea. Se supone que las excepciones le permitirán escribir código más sólido ante condiciones de error. Si lanza un objeto de excepción de la manera convencional, puede estar seguro de que si es capturado por una cláusula catch que nombra el tipo correcto, por a catch (...)
, ya sea que se vuelva a lanzar o no, se destruirá correctamente en el momento adecuado. (La única excepción es si nunca se detecta, pero esta es una situación no recuperable, se mire como se mire).
Si lanza un puntero a un objeto asignado dinámicamente, debe asegurarse de que, sea cual sea el aspecto de la pila de llamadas en el punto en el que desea lanzar su excepción, hay un bloque de captura que nombra el tipo de puntero correcto y tiene la delete
llamada adecuada . Su excepción nunca debe ser capturada a catch (...)
menos que ese bloque vuelva a lanzar la excepción que luego es capturada por otro bloque de captura que maneja correctamente la excepción.
Efectivamente, esto significa que ha tomado la función de manejo de excepciones que debería facilitar la escritura de código robusto y dificulta la escritura de código que sea correcto en todas las situaciones. Esto deja de lado el problema de que será casi imposible actuar como código de biblioteca para el código de cliente que no espera esta característica.
throw gcnew
sería útil, por ejemplo. si desea que el código administrado detecte su excepción. ¿Alguien puede corregirme en eso?