5. Manejo de erroresx

Download Report

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