PDF de programación - Tema 4: Corrección y Robustez en C++

Imágen de pdf Tema 4: Corrección y Robustez en C++

Tema 4: Corrección y Robustez en C++gráfica de visualizaciones

Publicado el 24 de Enero del 2017
1.054 visualizaciones desde el 24 de Enero del 2017
83,8 KB
18 paginas
Creado hace 15a (24/11/2008)
Tema 4: Corrección y Robustez

en C++

Programación Orientada a Objetos

Curso 2008/2009
Begoña Moros Valle

Contenido

Asertos en C++

Mecanismo de excepciones:

Declaración de excepciones
Lanzar excepciones
Manejo de excepciones
Definición de excepciones
Excepciones de la librería estándar

Tema 4

Corrección y Robustez

2

Asertos en C++

Es posible definir puntos de chequeo en el código

utilizando los asertos
Ayuda útil para la depuración

Ofrece la macro assert() en <assert.h>
assert() evalúa su parámetro y llama a abort() si

el resultado es cero (false).

void Cuenta::ingreso(double cantidad){

assert(cantidad>0);
assert(estado == OPERATIVA);
saldo = saldo + cantidad;

}

Tema 4

Corrección y Robustez

3

Asertos en C++

Antes de abortar assert escribe en la salida
de error el nombre del archivo fuente y la línea
donde se produjo el error.

Si se define la macro NDEBUG, se desactiva la
comprobación de todos los asertos definidos.

Tema 4

Corrección y Robustez

4

Limitaciones asertos

Aunque los asertos se pueden utilizar para

controlar la corrección del código
(precondiciones, postcondiciones, invariantes)
tienen las mismas limitaciones que los assert
de Java.
Las precondiciones no se deben evaluar con assert
No se debe abortar un programa como consecuencia

de un fallo en la postcondición

Para ayudar a la verificación de los programas

C++ también existen entornos para la
definición de pruebas unitarias
CPPUnit es uno de los entornos más utilizado

Tema 4

Corrección y Robustez

5

Excepciones en C++

En C++ se utiliza el mecanismo de excepciones

para notificar que se ha producido una
situación excepcional.

A diferencia de Java, una excepción no tiene

por qué ser un objeto de una clase:
Se puede lanzar “cualquier cosa” (un entero, una

cadena de texto, …)

No existen distintas categorías de excepciones
Puede ser útil definir una jerarquía de excepciones,

aunque no es obligatorio

Tema 4

Corrección y Robustez

6

Lanzamiento de excepciones

Se utiliza la palabra reservada throw
Podemos lanzar un número o una cadena de texto para

informar de un fallo en la precondición

Se desaconseja esta práctica en un programa OO

void Cuenta::ingreso(double cantidad){

if (cantidad<0)

throw cantidad;

if (estado!= OPERATIVA)

throw "Fallo pre. Estado incorrecto";

saldo = saldo + cantidad;

}

Tema 4

Corrección y Robustez

7

Excepciones en la librería estándar
Existe un conjunto de excepciones predefinidas en el

espacio de nombres std (<stdexcept>)

Todas ellas heredan de la clase std::exception

(<exception>)
Disponen del método what() que devuelve la cadena de texto

con el informe del error

La clase exception se puede utilizar como raíz de una
jerarquía de excepciones definidas por el programador,
aunque no es obligatorio
Las nuevas excepciones deben redefinir el método what para

que lancen el mensaje de error más conveniente.

Tema 4

Corrección y Robustez

8

Excepciones en la librería estándar

logic_error: fallo en las precondiciones
runtime_error: fallo en las postcondiciones

Tema 4

Corrección y Robustez

9

Uso de excepciones estándar

Para el control de precondiciones se lanzan
excepciones compatibles con logic_error

void Cuenta::ingreso(double cantidad) {

if (cantidad < 0)

throw invalid_argument(“Cantidad negativa");

if (estado != OPERATIVA)

throw logic_error("Estado incorrecto");

saldo = saldo + cantidad;

}

Tema 4

Corrección y Robustez

10

Excepciones de usuario

Cualquier tipo de datos puede ser lanzado en

una excepción.
Se recomienda crear una clase que herede de
runtime_error:
class RedNoDisponible: public runtime_error{
public:
RedNoDisponible(const char* m);
};
RedNoDisponible::RedNoDisponible(const char* msg):
runtime_error(msg) {}
Las excepciones que heredan de exception
disponen del método what() que retorna el
mensaje de error.

Tema 4

Corrección y Robustez

11

Declaración de excepciones
Se utiliza también la palabra reservada throw
Se puede especificar el conjunto de excepciones que

puede lanzar un método
void f(int a) throw (E1, E2);
f puede lanzar excepciones de tipo E1 y E2 pero no otras

Si no se dice nada, significa que podría lanzar cualquier

excepción (o ninguna)
int f();
f podría lanzar cualquier excepción

Se puede indicar que un método no lanzará ninguna

excepción
int f() throw();
f no puede lanzar ninguna excepción (lista vacía)

Tema 4

Corrección y Robustez

12

Declaración de excepciones

A diferencia de Java, el compilador ignora la

declaración de las excepciones
Si en tiempo de ejecución se intenta lanzar una excepción no

declarada, se detecta la violación y termina la ejecución.

Se aplica la política “confía en el programador”:

El compilador no obliga al código cliente a manejar las

excepciones que puede lanzar un método

Si ocurre una excepción y el programador no ha definido

como manejarla, la excepción escaparía del método

Un método redefinido no puede lanzar más excepciones

que las especificadas en el método de la clase padre.
La concordancia entre las especificaciones de la clase padre e hija si

es controlada por el compilador

Tema 4

Corrección y Robustez

13

Declaración de las excepciones

void Cuenta::ingreso(double cantidad) throw (invalid_argument,
logic_error){

if (cantidad<0)

throw invalid_argument("cantidad negativa");

if (estado!= OPERATIVA)

throw logic_error("Estado incorrecto");

saldo = saldo + cantidad;

}

Declaramos que el método ingreso SÓLO puede lanzar

las excepciones invalid_argument y
logic_error

Si en el cuerpo del método se produjese alguna otra

excepción sería incompatible con la declaración.
Tema 4

Corrección y Robustez

14

Manejo de excepciones

Como en Java, se debe definir un manejador

(catch) por cada excepción que se espera que
pueda lanzar la ejecución de un bloque de
código (try).
A diferencia de Java, no es obligatorio, el

compilador no comprueba si esto se hace o no

Las excepciones se pueden pasar al manejador

por valor o por referencia
Cuando las excepciones son objetos se deben

pasar por referencia para asegurar el
comportamiento polimórfico

Tema 4

Corrección y Robustez

15

Manejo de excepciones

Igual que en Java, cuando ocurre una excepción se
evalúan los tipos definidos en los manejadores y se
ejecuta el que sea compatible
Hay que tener en cuenta el orden en el caso de utilizar una

jerarquía de excepciones

Se puede definir un manejador para cualquier tipo de

excepción
catch(…)

Es posible relanzar la misma excepción que se está

manejando
throw;

Tema 4

Corrección y Robustez

16

Conexion* conexion;
int intentos = 0;
while (intentos < 20) {

try {

} catch (RedNoDisponible& e) {

conexion = new Conexion(url);
break;
intentos++;
if (intentos == 20) throw; //relanza

}

Método visualizar del navegador web

void Navegador::visualiza(string url){

}
//Se ha abierto la conexión y se leen las líneas …

}
Si al crear la conexión ocurren las excepciones

ServidorNoEncontrado o RecursoNoDisponible (no
manejadas) pasarán al cliente

Tema 4

Corrección y Robustez

17

Código cliente

int main(){

Navegador navegador;
try{

navegador.visualiza(“http://www.poo.c++");

}catch(ErrorConexion& e){

cout<<"Fin del programa. "<<e.what()<<endl;

} //maneja cualquiera de las subclases
catch(...){ //maneja cualquier otra excepción
cout<<"Fin por excepción no prevista"<<endl;

}

}

Tema 4

Corrección y Robustez

18
  • Links de descarga
http://lwp-l.com/pdf2102

Comentarios de: Tema 4: Corrección y Robustez en C++ (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad