C ++: el mecanismo de excepción
La próxima vez que usted está examinando un ejemplo de código C ++, echar un vistazo más de cerca a los pasos que el código pasa por manejar una excepción. Cuando se produce un saque de banda, las primeras copias de C ++ el objeto arrojados a un lugar neutral. A continuación, comienza a buscar el final de la actual probar bloque.
Si una probar bloque no se encuentra en la función actual, el control pasa a la función de llamada. Una búsqueda se hace a continuación de esa función. Si no probar bloque se encuentra allí, el control pasa a la función que la llamó, y así sucesivamente hasta la pila de llamadas a funciones. Este proceso se llama desenrollar la pila.
Una característica importante de desenrollado pila es que, como cada pila se desenrolla, los objetos que salen de alcance se destruyen como si la función había ejecutado una regreso comunicado. Esto evita que el programa de la pérdida de activos o dejar objetos colgando.
Cuando la envolvente probar bloque se encuentra, el código busca en la primera captura frase inmediatamente después de la llave de cierre del captura bloque. Si el objeto lanzado coincide con el tipo de argumento especificado en el captura declaración, el control pasa a ese captura frase.
Si no, se realiza una comprobación de la siguiente captura frase. Si no hay ninguna coincidencia captura frases se encuentran, las búsquedas de código para el siguiente nivel superior probar bloquear en una espiral cada vez más hacia afuera hasta una adecuada captura puede ser encontrado. Si no captura frase se encuentra, el programa se termina.
Considere el siguiente ejemplo:
// CascadingException - el siguiente programa demuestra // un ejemplo de pila relajarse # include#include #include using namespace std - // prototipos de algunas funciones que necesitaremos f1 latervoid () - vacío f2 () - vacío f3 () - clase Obj {public: Obj (char c): etiqueta (c) {cout lt; lt; "La construcción de objeto" lt; lt; etiqueta lt; lt; endl-} ~ Obj () {cout lt; lt; "Objeto destruible" lt; lt; etiqueta lt; lt; endl-} protegida: la etiqueta Char -} - int main (int nNumberofArgs, char * pszArgs []) {f1 () - // espera hasta que el usuario está listo antes de finalizar el programa // para que el usuario pueda ver el resultscout programa lt; lt; "Pulse Intro para continuar ..." lt; lt; endl-cin.ignore (10, ' n') - cin.get () - volver 0-} f1 void () {Obj una ('a') - try {Obj b ('b') - f2 () -} catch (float f) {cout lt; lt; "Pesca del flotador" lt; lt; endl-} catch (int i) {cout lt; lt; "Atrapar Int" lt; lt; endl-} catch (...) {cout lt; lt; cadena ("captura genérica") lt; lt; endl -}} void f2 () {try {Obj c ('c') - f3 () -} catch (msg cadena) {cout lt; lt; "Atrapar String" lt; lt; endl -}} void f3 () {obj d ("d") - tiro 10-}
El resultado de la ejecución de este programa aparece como sigue:
Construir objeto aConstructing objeto bConstructing objeto objeto cConstructing objeto dDestructing dDestructing objeto objeto cDestructing objeto bInt catchDestructing aPresione Intro para continuar ...
En primer lugar, se ven los cuatro objetos a, b, c, y d siendo construido como se main () llamadas f1 () que llama f2 () que llama f3 (). En vez de vuelta, sin embargo, f3 () lanza el entero 10. Porque nadie probar bloque se define en f3 (), C ++ desenrolla f3 () # 8242-s de pila, causando objeto d deben ser destruidas.
La siguiente función en la cadena, f2 () define una probar bloque, pero su único captura frase está diseñado para manejar una cuerda, que doesn # 8242-t partido la int lanzado. Por lo tanto, C ++ sigue buscando. Este desenrolla f2 () # 8242-s pila, lo que resulta en el objeto c siendo destruido.
De nuevo en f1 (), C ++ encuentra otro probar bloque. Salir de ese objeto causas de bloque b ir fuera de alcance. C ++ se salta el primero captura frase para una flotador. El próximo captura frase coincide con el int exactamente, por lo que C ++ pasa el control a esta frase.
El control pasa desde el capturas (int) frase a la llave de cierre de la final captura frase y desde allí de vuelta a main (). El final captura(...) frase, que sería coger cualquier objeto lanzado, se omite porque un juego captura frase ya fue encontrado.