(I) Paso de Excepciones entre funciones (II)

Anuncio
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
Descargar