MANEJO DE EXCEPCIONES EN C C Se intenta

  • Slides: 11
Download presentation
MANEJO DE EXCEPCIONES EN C++

MANEJO DE EXCEPCIONES EN C++

C++ • Se intenta ejecutar un bloque de código • Se produce la circunstancia

C++ • Se intenta ejecutar un bloque de código • Se produce la circunstancia excepcional • Se desvía la ejecución del programa a un sitio especifico

try { // bloque de código que se intenta. . . if (condición) throw

try { // bloque de código que se intenta. . . if (condición) throw ¨……. . ¨ ; . . . } catch (. . . ) { // bloque manejador de posibles excepciones. . . }. . . // continua la ejecución normal

Ejemplo: # include <stdio. h> bool pass; class Out{ }; void festival (bool); int

Ejemplo: # include <stdio. h> bool pass; class Out{ }; void festival (bool); int main( ) { try { pass = true; festival (true); } catch(Out o) { pass = false; } return pass ? (puts("Acierto!"), 0) : (puts("Fallo!"), 1); } void festival (bool firsttime){ if (firsttime) throw Out( ); } Salida: Fallo!

Secuencia normal del bloque-intento (Try-block) A: Se produce una circunstancia excepcional: Se lanza la

Secuencia normal del bloque-intento (Try-block) A: Se produce una circunstancia excepcional: Se lanza la excepción señalada por la sentencia throw El programa busca por un manejador ("handler") adecuado a la excepción • Se encuentra el ¨handler¨ : La pila (stack) es recorrida hacia abajo hasta el punto donde está el manejador. El control del programa es transferido al manejador.

Secuencia normal del bloque-intento (Try-block) • No se encuentra ningún manejador: Se invoca la

Secuencia normal del bloque-intento (Try-block) • No se encuentra ningún manejador: Se invoca la función terminate(): o Se ha establecido una función t_func por defecto con set_terminate(). programa). terminate invoca t_func (que debe terminar el o No se ha establecido ninguna función por defecto con set_terminate() terminate invoca la función abort(). B: No se produce ninguna excepcion: El programa sigue su ejecución normal (saltándose los bloques catch que pudieran seguir).

#include <except. h> #include <process. h> #include <stdio. h> bool pass; class Out{}; void

#include <except. h> #include <process. h> #include <stdio. h> bool pass; class Out{}; void final(); void festival(bool); void test(); int main() { set_terminate(final); test(); return pass ? (puts("Salir del test"), 0) : (puts("Seguir el test"), 1); } void final(){ puts("*** Nadie captura la excepción ***"); abort(); } void festival (bool firsttime) { if (firsttime) throw Out(); } void test () { festival(true); }

Manejador de excepciones (“handler”) try {. . . } // bloque-intento // posibles errores

Manejador de excepciones (“handler”) try {. . . } // bloque-intento // posibles errores catch (Tipo. X x) { // capturar errores X. . . } catch (Tipo. Y y) { // capturar errores Y. . . }. . . // sigue aquí

El manejador universal: • catch (. . . ) { <sentencias> }

El manejador universal: • catch (. . . ) { <sentencias> }

#include <stdio. h> bool pass; class Out{}; void festival(bool firsttime) { if(firsttime) throw Out();

#include <stdio. h> bool pass; class Out{}; void festival(bool firsttime) { if(firsttime) throw Out(); } void test() try { festival(true); } catch(. . . ){ pass = true; } // puede capturar cualquier excepción } int main() { // ========= pass = false; test(); return pass ? (puts("Excepción capturada"), 0) : (puts("no hay excepción") , 1); }

 • Aunque es factible lanzar cualquier tipo de excepción, la librería estandar de

• Aunque es factible lanzar cualquier tipo de excepción, la librería estandar de C++ ofrece unas clases para este propósito: Exception Logic error Bad exception Bad alloc Bad cast Bad typeid Runtime error Out of range Domain error Length error Invalid argument Range error Overflow error Underflow error