Está en la página 1de 8

Excepciones

Nilson Mossos V.

Universidad del Valle

Abril, 2009

Introduccin a la Programacin Orientada a Objetos

Nilson Mossos V. (UV) Excepciones Abril, 2009 1/8


Excepciones

Usan tres palabras clave:


// Dato es cualquier tipo de dato (clase o primitivo)
try // Bloque donde pueden lanzarse excepciones.
{
// etc.
throw dato; // Lanza una excepcin con un dato.
// etc.
}
catch(Dato dato) // Captura las excepciones que hayan
{ // ocurrido dentro del bloque try.
// etc.
}

Nilson Mossos V. (UV) Excepciones Abril, 2009 2/8


Excepciones
La excepcin se debe lanzar (throw) en el caso de que haya una
situacin anmala, imposible de corregir en ese nivel del cdigo.
Las excepciones se pueden lanzar (throw) dentro del bloque try o de
cualquier funcin que se ejecute dentro del bloque try en cualquier
nivel de profundidad.
Puede haber bloques try anidados. Lo que no capture el interno, lo
deja para el externo. O en el catch() del interno se pueden lanzar
nuevas excepciones para que las capture el externo.
Al lanzar una excepcin (throw) se debe pasar un parmetro adicional
(por valor, por referencia, por puntero, por referencia constante o por
puntero a una constante).
Y entonces el catch() recibe ese parmetro.
Puede haber varios bloques catch() sobrecargados, es decir, cada uno
capturando un tipo distinto de dato lanzado con throw.
Puede haber, al final de todos, un catch(...). Los tres puntos significan
que capturan cualquier otro dato no especificado en los catch()
anteriores.
Nilson Mossos V. (UV) Excepciones Abril, 2009 3/8
Excepciones

Lo mas sencillo y eficiente es capturar las excepciones por referencia.


As nos evitamos duplicar objetos en memoria.
Adems, el manejo de memoria (creacin y destruccin del objeto
lanzado) se hace automticamente.
try
{
throw dato; // Se lanza el dato
}
catch(Dato &dato) // Se captura el dato por referencia
{
}

Nilson Mossos V. (UV) Excepciones Abril, 2009 4/8


Excepciones

Dentro de un catch(), la excepcin se puede relanzar con el mismo


parmetro que traa. Para ello hay que poner throw; sin ningn
parmetro.
La funcin que lanza excepciones puede declararse opcionalmente con
un filtro de tipo de datos para el throw. De este modo, la funcin se
compromete a lanzar nicamente tipos de datos especificados en el
filtro. Si el throw lanza otro tipo de dato no incluido en el filtro, el
resultado es indefinido.

Nilson Mossos V. (UV) Excepciones Abril, 2009 5/8


Excepciones
Hay unas cuantas clases que mantienen excepciones predefinidas del
sistema:
exception /* agrupa todos los errores */
logic_error : errores que se podran haber detectado antes de la
ejecucin del programa
I domain_error
I invalid_argument
I lenght_error
I out_of_range
I bad_cast
I bad_typeid
runtime_error :errores que solo pueden detectarse durante la
ejecucin del programa
I range_error
I overflow_error
I bad_alloc
.
Nilson Mossos V. (UV) Excepciones Abril, 2009 6/8
Excepciones

Al lanzar una excepcin, todos los objetos construidos


automticamente en ese mbito se destruyen (los objetos dinmicos
no se destruyen).
Si se detecta un error en un constructor, es conveniente lanzar una
excepcin, ya que es la nica manera de advertir que el objeto no fue
correctamente construido. Ojo: en ese caso no se llama a su destructor.
Es mala idea lanzar excepciones desde destructores.

Nilson Mossos V. (UV) Excepciones Abril, 2009 7/8


Excepciones

Tambin se puede intentar recuperarse de una excepcin:


bool correcto = true;
do
{
try
{
correcto = true;
// etc. Aqu puede haber un throw
}
catch(...)
{
// Aqu se corrigen las condiciones que produjeron la excepcin
correcto = false;
}
} while(!correcto);

Nilson Mossos V. (UV) Excepciones Abril, 2009 8/8