Introducción • La idea es separar el funcionamiento normal de un programa de la gestión de los errores. • Si algo va mal: Excepciones – División por cero. – No hay más memoria. – No existe el fichero deseado. • Se lanza una excepción que HAY que tratar. Curso de programación de C/C++ 50 Curso de programación de C/C++ Sintaxis 51 Ejemplo try { • Se apoya en – try {...}: Abarca el programa normal. Si todo va bien será lo ÚNICO que ejecute. – throw exception: Cuando algo va mal nos permite lanzar una excepción para indicarlo. – catch (class exception) {}: Nos permite tratar un tipo de excepción. Habrá un catch por cada tipo posible. Curso de programación de C/C++ 52 // Codigo normal ... if (algo mal) throw excep; // Si fue mal esto no ejecutaria ... } catch catch catch catch (int i) {...} // Excep. enteras (double d) { ...} // Excep. reales (my_exception) {...}//”mis” excep. (...) {...} // Las “demás” Curso de programación de C/C++ 53 Paso de Excepciones entre funciones (I) Paso de Excepciones entre funciones (II) • Si una función no captura una excepción está va a la función que la invocó, que saltará al “catch” correspondiente • Si ninguna la captura se produce una • Para limitar las excepciones que una función puede lanzar se puede indicar explicitamente cuales son las “autorizadas”: Abnormal program termination • Esto aconseja poner, tras los múltiples catch que nos interesan, siempre uno “por defecto” catch (...) { cout << “excepcion inexperada”; } //Admite todas las excepciones Curso de programación de C/C++ 54 void fun1 (int i) throw (int, double) {...} Void fun2 (int i) throw () {...} • Una función, dentro del catch, puede lanzar otra excepción (p.e. si no sabe tratar la 1ª) • E incluso relanzar la misma: throw; Curso de programación de C/C++ 55 1 Definir excepciones Definir excepciones • Hay algunas predefinidas: bad_alloc • Es mejor que extienda la clase “exception” try { p = new int[1000]; } catch (bad_alloc b) { cout <<“Memory Failure”;} • Incluso podemos definir nuestras Excep. class mi_excepcion: public exception {...}; class mi_excepcion{char *mensaje; ...}; try {mi_excepcion excep; ... Trow excep;} catch (mi_excepcion e) {cout << e.mensaje; ...}; Curso de programación de C/C++ • Tiene constructores, destructores, what, operador = 56 Curso de programación de C/C++ Aserciones (I) Aserciones (II) • Similar idea a las excepciones, pero detectan fallos del programador. • Toda función necesita que se cumplan unas premisas a la entrada (precondiciones) y deja el estado en un modo conocido (postcondiciones) • Si no se cumplen algo ha ido mal • Se pueden desactivar para no penalizar las ejecuciones “normales”: g++ -DNDEBUG … Curso de programación de C/C++ 57 58 • No están pensadas para ser tratadas (generan un Assertion failed) • No se tratan porque al ser errores de programación no deberían darse y si se dan no está claro como recuperarse assert(4 < 3); • Genera: Assertion failed: 4 < 3, file assert.cpp,line 8 Abort Curso de programación de C/C++ 59 2