Transcript 5. Manejo de erroresx
Slide 1
Informática II
Diego Fernando Serna Restrepo
1
Semestre 2011/2
Slide 2
Chiste del Día
Informática II
2011/2
2
Slide 3
Cuando usar referencias o punteros
Referencias
Punteros
Las referencias generan un código
mas limpio y fácil de usar
Trabajan directamente con
posiciones de memoria
No pueden ser reasignados
Se pueden reasignar, (reuso de
punteros)
Las referencias no pueden ser nulas.
Pueden tomar el valor de nulo en el
flujo del programa
Poco costoso para manejo de
funciones.
Poco costoso para manejo de
funciones.
Informática II
2011/2
3
Slide 4
Contenido
1
Introducción a las excepciones
2
Como utilizar excepciones?
3
Cómo crear excepciones?
4
Ejemplo
Informática II
2011/2
4
Slide 5
Manejo de errores
• Los programas tienen errores, y mientras
mas grandes sean los algoritmos, mayor
será la probabilidad de tenerlos.
• Corregir y encontrar errores es uno de los
enfoques mas costosos en la industria del
desarrollo del software.
• Las comunidades de software libre son
entornos ideales para hallar y corregir
errores.
Informática II
2011/2
5
Slide 6
Manejo de errores
• Los errores pueden ser encontrados
desde diferentes etapas del desarrollo, ya
sea por sintaxis inapropiada o problemas
lógicos del programa.
• Existen errores que un programador
puede predecir cuando se desarrolla un
aplicativo (operaciones inválidas, recursos
escasos, etc).
• A estos errores se les denomina
Informática II
“excepciones”.
2011/2
6
Slide 7
Manejo de errores
• En la programación, existen circunstancias que
pueden llevar a que un aplicativo se comporte
de manera inadecuada.
• Algunas de ellas se pueden evitar pero existen
algunas otras que simplemente son inevitables
(ej. recursos escasos).
• Para estos casos será posible preparar el
programa para que responda de manera
predeterminada a dichos estímulos.
Informática II
2011/2
7
Slide 8
Manejo de errores
• ¿Qué haría su programa si causa uno de
los más comunes errores matemáticos,
división por cero?
• Sus opciones incluyen:
Romper el flujo del programa.
Informar al usuario y salir con elegancia.
Informar al usuario y permitirle tratar de
recuperarse y continuar.
Tomar medidas correctivas y continuar sin
perturbar a el usuario.
Informática II
2011/2
8
Slide 9
Contenido
1
Introducción a las excepciones
2
Como utilizar excepciones?
3
Cómo crear excepciones?
4
Ejemplo
Informática II
2011/2
9
Slide 10
Excepciones
• Las excepciones son errores que ocurren
durante la ejecución del programa, por lo
que es vital tratarlos en tiempo real para
evitar que el programa simplemente
colapse y termine abruptamente sin
guardar los datos procesados o sin liberar
de manera correcta los recursos
utilizados, además de no tener la
oportunidad de dar aviso alguno al usuario
sobre las causas del problema.
Informática II
2011/2
10
Slide 11
Manejo de errores
• La idea básica detrás de las excepciones es bastante
sencillo:
El equipo intenta ejecutar un trozo de código.
Se incluye lógica (código) para estar preparados en caso de que
el código que está tratando de ejecutar falla por alguna razón
excepcional.
En caso de que su código presente un problema (excepción),
debe haber un camino desde el código donde se produce un
problema con el código que puede manejar la condición de
error.
El manejo de excepciones hace que estos tres puntos se
unen, y lo hacen de una manera relativamente sencilla.
Informática II
2011/2
11
Slide 12
Excepciones
C++ proporciona un mecanismo
potente para detectar y gestionar
errores en ejecución
(excepciones) se dispone de tres
palabras reservadas para ello:
try
catch
Informática II
2009/2
throw
12
Slide 13
Partes del manejo de excepciones
• C++ otorga bloques de código que pueden
capturar las excepciones que ocurran en
dicho espacio.
• Esto bloques se denominan bloques trycatch.
• Estos bloques además de capturar las
excepciones, ofrecen un espacio de
código que sólo se ejecutará cuando
ocurra la excepción.
Informática II
2011/2
13
Slide 14
try
• Proporciona un bloque o espacio donde se
ubican las partes del código que pueden
presentar algún problema o son
peligrosas.
catch
Bloques try-catch
• Captura el evento de error producido por
el código alojado en el bloque try. Es el
lugar donde se atiende la excepción,
tratando el problema de alguna manera
(Ejp: mandar un mensaje al usuario).
Se pueden tener múltiples bloques catch después del bloque try,
donde cada uno se hace cargo de un tipo diferente de error,
asemejándose a los casos de una sentencia switch.
Informática II
2011/2
14
Slide 15
Bloques try-catch
int main(){
try{
//código que posiblemente puede generar un error
funcionPeligrosa();
}
catch (type1 A){
//captura una excepción tipo 'type1'
//haga algo
//envíe un mensaje
}
catch (type2 B){
//captura una excepción tipo 'type2'
//haga algo
//envíe un mensaje
}
catch(...){
//captura cualquier excepción no tratada por los
//catch anteriores
}
return 0;
}
Informática II
2011/2
15
Slide 16
Bloque try-catch
Existe un bloque catch que puede ser
llamado en el caso que los anteriores
no puedan manejar un tipo de error en
particular, se llama “catch everything”
y es declarado así catch (…).
Después de una excepción, el flujo
del programa continúa luego del
bloque catch que atendió la
excepción, no después del punto
donde esta se genero (bloque try).
Informática II
2011/2
16
Slide 17
Contenido
1
Introducción a las excepciones
2
Como utilizar excepciones?
3
Cómo crear excepciones?
4
Ejemplo
Informática II
2011/2
17
Slide 18
Bloques try-catch
• La biblioteca estándar “exception” contiene la
implementación de algunas excepciones
comunes en la programación (ej. overflow_error,
out_of_range, entre otros)
• Para el resto de las excepciones será necesario
indicarle al programa cuando como serán el
resto de las excepciones.
•
Ver ejemplo2.cpp
Informática II
2011/2
18
Slide 19
Biblioteca exception
Informática II
2011/2
19
Slide 20
stdexcept
#include
#include
//excepciones estándar
using namespace std;
int main() {
int *x;
int y = 1000000000;
Al utilizar el operador new, si
#include
no hay
memoria
suficiente,
se
Este
encabezado
define
un
conjunto
excepciones
producedeuna
excepción. Luego
estándar,
que la librería
se hacetales
un
throw
implícito
de
bad_alloc
e
instancia
un
como los programas creados por
un objeto
la clase
objeto
de pueden
lade
clase
bad_alloc,
endl;
el usuario
utilizarlos
para
bad_alloc,
que
es tratado
reportar
errores
comunes.
permitiéndonos
ingresar
al por
try {
x = new int[y];
cout << "Puntero: " << x <<
delete[] x;
//no existe throw
el bloque
catchque
respectivo.
método
what(),
nos da
}
acceso a el mensaje estándar
catch(bad_alloc e) {
predefinido.
cout << "Error:" << e.what()< }
.
return 0;
}
Informática II
2009/2
20
Slide 21
Crear excepciones
• Para declarar una excepción será
necesario usar la palabra reservada
“throw”, y se usa como se muestra a
continuación.
throw excepcion;
• Una vez creada, el bloque try la capturará
se la enviará al bloque catch para que
ésta se haga cargo de ella.
Informática II
2011/2
21
Slide 22
throw
throw
• Se comporta como un return dentro
del bloque try. Permite que el flujo del
programa salte a donde se va a tratar
el problema (bloque catch adecuado).
Esto lo hace gracias al tipo de dato
retornado con esta sentencia.
Informática II
2011/2
22
Slide 23
throw
Los tipos de la expresión throw y el especificado en
el argumento del bloque catch deben coincidir, La
concordancia de tipos es muy estricta. Ejp: no se
considera como el mismo tipo int que unsigned int.
Si no se encontrara ningún catch adecuado, se
abandona el programa, del mismo modo como si se
produjese una excepción y no la tratáramos.
El tipo de dato que es utilizado como argumento
dentro del bloque catch puede ser cualquiera incluso
una clase creada por el usuario, además puede ser
pasado como referencia.
Informática II
2009/2
23
Slide 24
Clases de excepciones
• Son usadas para crear excepciones.
• Es posible encontrar dichas clases sin
datos ni métodos adicionales a los que el
compilador regala.
Class Clase
{
...
public:
class excepcion{}; //excepción
...
} //Ver ejemplo4.cpp
Informática II
2011/2
24
Slide 25
Clases para las excepciones
• Las excepciones son clases, por lo tanto
podrán implementar todas las
características de las clases (usar
herencia, polimorfismo, etc.)
Informática II
2011/2
25
Slide 26
Contenido
1
Introducción a las excepciones
2
Como utilizar excepciones?
3
Cómo crear excepciones?
4
Ejemplo
Informática II
2011/2
26
Slide 27
Ejemplo try-catch
#include
class
carro{
//se define la clase para la excepción
class carro::problema{
private:
char *mensaje;
public:
problema();
problema(char *_mensaje);
char* what();
~problema();
};
using namespace std;
private:
int gGasolina;
carro renault4(11,"renault",120);
char *marca;
int velMax;
//Ejemplo
uso de clases
int int
main(){
vel;
try{bool start;
renault4.arrancar();
for(int i=0; i<30; i++){
public: renault4.acelerar();
// se declara
la clase
para la
cout<<"velocidad
actual:\
excepción
"< class problema;
}
}
carro();
carro(int _gGasolina,char *_marca,
catch(carro::problema e){
int _velMax);
cout<<"Problema hallado:\
void
arrancar();
"< void
acelerar();
}
}
void frenar();
int getVel() const;
~carro();
carro::problema::problema(){
carro::carro(){
carro::carro(int
void
carro::acelerar(){
_gGasolina,char *_marca,
gGasolina=0;
if(--gGasolina<=0){
mensaje="error";
int _velMax){
} gGasolina=_gGasolina;
marca=0;
throw problema("no puede
carro::problema::problema(char
velMax=0;
marca=_marca;
*_mensaje){
acelerar sin gasolina");
vel=0;
velMax=_velMax;
mensaje=_mensaje;
}
} vel=0;
start=false;
vel++;
}
char*
carro::problema::what(){
}
return mensaje;
}
carro::problema::~problema(){}
};
Informática II
2011/2
27
Slide 28
Ejemplo try-catch
• El parámetro entregado como argumento en la sentencia
throw, pudo ser asignado mediante la declaración de un
nuevo objeto tipo problema o directamente como se
muestra a continuación.
void carro::arrancar(){
start=true;
vel=10;
gGasolina-=10;
if(gGasolina<=0){
throw problema("no
//problema
error1("no
puede
puede
arrancar
arrancar
sinsin
gasolina");
gasolina");
}
problema error1=problema ("no puede arrancar sin gasolina");
}
throw error1;
}
}
Informática II
2011/2
28
Slide 29
Ejemplo try-catch
Solo puede existir un bloque catch de un tipo de dato
determinado, es decir no pueden existir dos bloques catch
cuyo tipo de argumento de entrada se repita
El boque catch actúa como si se tratase de una función, por lo
que sus argumentos de entrada pueden ser pasados por valor
o por referencia.
catch(carro::problema e){
cout<<"Problema hallado: "< }
catch(carro::problema &e){
cout<<"Problema hallado: "< }
Informática II
2011/2
29
Slide 30
Ejemplo try-catch
Incluso es posible llevar como argumento al bloque
catch tan solo el tipo de argumento sin un nombre,
pero en nuestro caso no se podría acceder a los
métodos del objeto (what( )).
catch(carro::problema ){
cout<<"Problema hallado: "< }
Ejercicio: Crear otra clase que maneje la excepción
(error) cuando la velocidad del carro luego de
acelerarlo, sea mayor a la velocidad máxima permitida.
Informática II
2011/2
30
Slide 31
Informática II
2011/2
31
Slide 32
Bibliografía
• Curso C++ con clase
http://c.conclase.net/curso/?cap=043
• Pagina de Referencia lenguaje C++:
• http://www.cplusplus.com/reference/std/ex
ception/exception/
• http://www.cplusplus.com/reference/std/st
dexcept/
• Sams Teach yourselft C++ in 21 days:
http://newdata.box.sk/bx/c/htm/ch20.htm#
Heading1
Informática II
2011/2
32
Slide 33
33
Informática II
Informática II
Diego Fernando Serna Restrepo
1
Semestre 2011/2
Slide 2
Chiste del Día
Informática II
2011/2
2
Slide 3
Cuando usar referencias o punteros
Referencias
Punteros
Las referencias generan un código
mas limpio y fácil de usar
Trabajan directamente con
posiciones de memoria
No pueden ser reasignados
Se pueden reasignar, (reuso de
punteros)
Las referencias no pueden ser nulas.
Pueden tomar el valor de nulo en el
flujo del programa
Poco costoso para manejo de
funciones.
Poco costoso para manejo de
funciones.
Informática II
2011/2
3
Slide 4
Contenido
1
Introducción a las excepciones
2
Como utilizar excepciones?
3
Cómo crear excepciones?
4
Ejemplo
Informática II
2011/2
4
Slide 5
Manejo de errores
• Los programas tienen errores, y mientras
mas grandes sean los algoritmos, mayor
será la probabilidad de tenerlos.
• Corregir y encontrar errores es uno de los
enfoques mas costosos en la industria del
desarrollo del software.
• Las comunidades de software libre son
entornos ideales para hallar y corregir
errores.
Informática II
2011/2
5
Slide 6
Manejo de errores
• Los errores pueden ser encontrados
desde diferentes etapas del desarrollo, ya
sea por sintaxis inapropiada o problemas
lógicos del programa.
• Existen errores que un programador
puede predecir cuando se desarrolla un
aplicativo (operaciones inválidas, recursos
escasos, etc).
• A estos errores se les denomina
Informática II
“excepciones”.
2011/2
6
Slide 7
Manejo de errores
• En la programación, existen circunstancias que
pueden llevar a que un aplicativo se comporte
de manera inadecuada.
• Algunas de ellas se pueden evitar pero existen
algunas otras que simplemente son inevitables
(ej. recursos escasos).
• Para estos casos será posible preparar el
programa para que responda de manera
predeterminada a dichos estímulos.
Informática II
2011/2
7
Slide 8
Manejo de errores
• ¿Qué haría su programa si causa uno de
los más comunes errores matemáticos,
división por cero?
• Sus opciones incluyen:
Romper el flujo del programa.
Informar al usuario y salir con elegancia.
Informar al usuario y permitirle tratar de
recuperarse y continuar.
Tomar medidas correctivas y continuar sin
perturbar a el usuario.
Informática II
2011/2
8
Slide 9
Contenido
1
Introducción a las excepciones
2
Como utilizar excepciones?
3
Cómo crear excepciones?
4
Ejemplo
Informática II
2011/2
9
Slide 10
Excepciones
• Las excepciones son errores que ocurren
durante la ejecución del programa, por lo
que es vital tratarlos en tiempo real para
evitar que el programa simplemente
colapse y termine abruptamente sin
guardar los datos procesados o sin liberar
de manera correcta los recursos
utilizados, además de no tener la
oportunidad de dar aviso alguno al usuario
sobre las causas del problema.
Informática II
2011/2
10
Slide 11
Manejo de errores
• La idea básica detrás de las excepciones es bastante
sencillo:
El equipo intenta ejecutar un trozo de código.
Se incluye lógica (código) para estar preparados en caso de que
el código que está tratando de ejecutar falla por alguna razón
excepcional.
En caso de que su código presente un problema (excepción),
debe haber un camino desde el código donde se produce un
problema con el código que puede manejar la condición de
error.
El manejo de excepciones hace que estos tres puntos se
unen, y lo hacen de una manera relativamente sencilla.
Informática II
2011/2
11
Slide 12
Excepciones
C++ proporciona un mecanismo
potente para detectar y gestionar
errores en ejecución
(excepciones) se dispone de tres
palabras reservadas para ello:
try
catch
Informática II
2009/2
throw
12
Slide 13
Partes del manejo de excepciones
• C++ otorga bloques de código que pueden
capturar las excepciones que ocurran en
dicho espacio.
• Esto bloques se denominan bloques trycatch.
• Estos bloques además de capturar las
excepciones, ofrecen un espacio de
código que sólo se ejecutará cuando
ocurra la excepción.
Informática II
2011/2
13
Slide 14
try
• Proporciona un bloque o espacio donde se
ubican las partes del código que pueden
presentar algún problema o son
peligrosas.
catch
Bloques try-catch
• Captura el evento de error producido por
el código alojado en el bloque try. Es el
lugar donde se atiende la excepción,
tratando el problema de alguna manera
(Ejp: mandar un mensaje al usuario).
Se pueden tener múltiples bloques catch después del bloque try,
donde cada uno se hace cargo de un tipo diferente de error,
asemejándose a los casos de una sentencia switch.
Informática II
2011/2
14
Slide 15
Bloques try-catch
int main(){
try{
//código que posiblemente puede generar un error
funcionPeligrosa();
}
catch (type1 A){
//captura una excepción tipo 'type1'
//haga algo
//envíe un mensaje
}
catch (type2 B){
//captura una excepción tipo 'type2'
//haga algo
//envíe un mensaje
}
catch(...){
//captura cualquier excepción no tratada por los
//catch anteriores
}
return 0;
}
Informática II
2011/2
15
Slide 16
Bloque try-catch
Existe un bloque catch que puede ser
llamado en el caso que los anteriores
no puedan manejar un tipo de error en
particular, se llama “catch everything”
y es declarado así catch (…).
Después de una excepción, el flujo
del programa continúa luego del
bloque catch que atendió la
excepción, no después del punto
donde esta se genero (bloque try).
Informática II
2011/2
16
Slide 17
Contenido
1
Introducción a las excepciones
2
Como utilizar excepciones?
3
Cómo crear excepciones?
4
Ejemplo
Informática II
2011/2
17
Slide 18
Bloques try-catch
• La biblioteca estándar “exception” contiene la
implementación de algunas excepciones
comunes en la programación (ej. overflow_error,
out_of_range, entre otros)
• Para el resto de las excepciones será necesario
indicarle al programa cuando como serán el
resto de las excepciones.
•
Ver ejemplo2.cpp
Informática II
2011/2
18
Slide 19
Biblioteca exception
Informática II
2011/2
19
Slide 20
stdexcept
#include
#include
//excepciones estándar
using namespace std;
int main() {
int *x;
int y = 1000000000;
Al utilizar el operador new, si
#include
no hay
memoria
suficiente,
se
Este
encabezado
define
un
conjunto
excepciones
producedeuna
excepción. Luego
estándar,
que la librería
se hacetales
un
throw
implícito
de
bad_alloc
e
instancia
un
como los programas creados por
un objeto
la clase
objeto
de pueden
lade
clase
bad_alloc,
endl;
el usuario
utilizarlos
para
bad_alloc,
que
es tratado
reportar
errores
comunes.
permitiéndonos
ingresar
al por
try {
x = new int[y];
cout << "Puntero: " << x <<
delete[] x;
//no existe throw
el bloque
catchque
respectivo.
método
what(),
nos da
}
acceso a el mensaje estándar
catch(bad_alloc e) {
predefinido.
cout << "Error:" << e.what()<
.
return 0;
}
Informática II
2009/2
20
Slide 21
Crear excepciones
• Para declarar una excepción será
necesario usar la palabra reservada
“throw”, y se usa como se muestra a
continuación.
throw excepcion;
• Una vez creada, el bloque try la capturará
se la enviará al bloque catch para que
ésta se haga cargo de ella.
Informática II
2011/2
21
Slide 22
throw
throw
• Se comporta como un return dentro
del bloque try. Permite que el flujo del
programa salte a donde se va a tratar
el problema (bloque catch adecuado).
Esto lo hace gracias al tipo de dato
retornado con esta sentencia.
Informática II
2011/2
22
Slide 23
throw
Los tipos de la expresión throw y el especificado en
el argumento del bloque catch deben coincidir, La
concordancia de tipos es muy estricta. Ejp: no se
considera como el mismo tipo int que unsigned int.
Si no se encontrara ningún catch adecuado, se
abandona el programa, del mismo modo como si se
produjese una excepción y no la tratáramos.
El tipo de dato que es utilizado como argumento
dentro del bloque catch puede ser cualquiera incluso
una clase creada por el usuario, además puede ser
pasado como referencia.
Informática II
2009/2
23
Slide 24
Clases de excepciones
• Son usadas para crear excepciones.
• Es posible encontrar dichas clases sin
datos ni métodos adicionales a los que el
compilador regala.
Class Clase
{
...
public:
class excepcion{}; //excepción
...
} //Ver ejemplo4.cpp
Informática II
2011/2
24
Slide 25
Clases para las excepciones
• Las excepciones son clases, por lo tanto
podrán implementar todas las
características de las clases (usar
herencia, polimorfismo, etc.)
Informática II
2011/2
25
Slide 26
Contenido
1
Introducción a las excepciones
2
Como utilizar excepciones?
3
Cómo crear excepciones?
4
Ejemplo
Informática II
2011/2
26
Slide 27
Ejemplo try-catch
#include
class
carro{
//se define la clase para la excepción
class carro::problema{
private:
char *mensaje;
public:
problema();
problema(char *_mensaje);
char* what();
~problema();
};
using namespace std;
private:
int gGasolina;
carro renault4(11,"renault",120);
char *marca;
int velMax;
//Ejemplo
uso de clases
int int
main(){
vel;
try{bool start;
renault4.arrancar();
for(int i=0; i<30; i++){
public: renault4.acelerar();
// se declara
la clase
para la
cout<<"velocidad
actual:\
excepción
"<
}
}
carro();
carro(int _gGasolina,char *_marca,
catch(carro::problema e){
int _velMax);
cout<<"Problema hallado:\
void
arrancar();
"<
acelerar();
}
}
void frenar();
int getVel() const;
~carro();
carro::problema::problema(){
carro::carro(){
carro::carro(int
void
carro::acelerar(){
_gGasolina,char *_marca,
gGasolina=0;
if(--gGasolina<=0){
mensaje="error";
int _velMax){
} gGasolina=_gGasolina;
marca=0;
throw problema("no puede
carro::problema::problema(char
velMax=0;
marca=_marca;
*_mensaje){
acelerar sin gasolina");
vel=0;
velMax=_velMax;
mensaje=_mensaje;
}
} vel=0;
start=false;
vel++;
}
char*
carro::problema::what(){
}
return mensaje;
}
carro::problema::~problema(){}
};
Informática II
2011/2
27
Slide 28
Ejemplo try-catch
• El parámetro entregado como argumento en la sentencia
throw, pudo ser asignado mediante la declaración de un
nuevo objeto tipo problema o directamente como se
muestra a continuación.
void carro::arrancar(){
start=true;
vel=10;
gGasolina-=10;
if(gGasolina<=0){
throw problema("no
//problema
error1("no
puede
puede
arrancar
arrancar
sinsin
gasolina");
gasolina");
}
problema error1=problema ("no puede arrancar sin gasolina");
}
throw error1;
}
}
Informática II
2011/2
28
Slide 29
Ejemplo try-catch
Solo puede existir un bloque catch de un tipo de dato
determinado, es decir no pueden existir dos bloques catch
cuyo tipo de argumento de entrada se repita
El boque catch actúa como si se tratase de una función, por lo
que sus argumentos de entrada pueden ser pasados por valor
o por referencia.
catch(carro::problema e){
cout<<"Problema hallado: "<
catch(carro::problema &e){
cout<<"Problema hallado: "<
Informática II
2011/2
29
Slide 30
Ejemplo try-catch
Incluso es posible llevar como argumento al bloque
catch tan solo el tipo de argumento sin un nombre,
pero en nuestro caso no se podría acceder a los
métodos del objeto (what( )).
catch(carro::problema ){
cout<<"Problema hallado: "<
Ejercicio: Crear otra clase que maneje la excepción
(error) cuando la velocidad del carro luego de
acelerarlo, sea mayor a la velocidad máxima permitida.
Informática II
2011/2
30
Slide 31
Informática II
2011/2
31
Slide 32
Bibliografía
• Curso C++ con clase
http://c.conclase.net/curso/?cap=043
• Pagina de Referencia lenguaje C++:
• http://www.cplusplus.com/reference/std/ex
ception/exception/
• http://www.cplusplus.com/reference/std/st
dexcept/
• Sams Teach yourselft C++ in 21 days:
http://newdata.box.sk/bx/c/htm/ch20.htm#
Heading1
Informática II
2011/2
32
Slide 33
33
Informática II