Informática II Prof. Dr. Gustavo Patiño MJ 16- 18 04-03-2014

Download Informática II Prof. Dr. Gustavo Patiño MJ 16- 18 04-03-2014

Post on 04-Feb-2015

2 views

Category:

Documents

0 download

Embed Size (px)

TRANSCRIPT

<ul><li> Diapositiva 1 </li> <li> Informtica II Prof. Dr. Gustavo Patio MJ 16- 18 04-03-2014 </li> <li> Diapositiva 2 </li> <li> Objetivos: Saber manejar situaciones inesperadas dentro de un programa Comprender como controlar las situaciones inesperadas. Saber lanzar excepciones. Saber manejar excepciones. Conocer los distintos tipos de excepciones. </li> <li> Diapositiva 3 </li> <li> Contenidos: Definicin de excepcin. Tipos de excepciones. Manejo de excepciones. Try Throw Catch. Clase Exception. Ejemplos. </li> <li> Diapositiva 4 </li> <li> Diapositiva 5 </li> <li> Diapositiva 6 </li> <li> Si uno de esos errores se produce y no implementamos el manejo de excepciones: El programa terminar abruptamente. Es muy probable que si hay archivos abiertos no se guarde el contenido de los buffers, ni se cierren. Adems ciertos objetos no sern destruidos, y se producirn fugas de memoria. </li> <li> Diapositiva 7 </li> <li> En programas pequeos se puede prevenir las situaciones en que se pueden producir excepciones, y evitarlas. </li> <li> Diapositiva 8 </li> <li> Slo nos queda evitar peticiones de memoria que puedan fallar, pero eso no es previsible. Sin embargo, C++ proporciona un mecanismo lo suficiente potente para detectar errores de ejecucin: Las excepciones. Para ello se dispone de tres palabras reservadas: try, catch y throw </li> <li> Diapositiva 9 </li> <li> Diapositiva 10 </li> <li> Evento que ocurre durante la ejecucin de un programa y requiere la ejecucin de cdigo fuera del flujo normal del programa. Una excepcin no es necesariamente un error en la ejecucin. Si no implementamos el manejo de excepciones, el programa que se ejecuta ser terminado abruptamente. Las excepciones mas habituales son las peticiones de memoria fallidas. </li> <li> Diapositiva 11 </li> <li> Sncronas: Asncronas: Aparecen inmediatamente cuando un proceso intenta ejecutar una operacin incorrecta. Aparecen algn tiempo despus, en el proceso que intent la operacin errnea o en otro distinto Hardware: Software: ejemplos: error en ndice de array, divisin por cero Hardware: Software: ejemplo: avera en dispositivo externo. ejemplo: error en comprobacin de asercin (condicin lgica) ejemplo: deteccin de lmite de tiempo en una accin de otro proceso Generacin Deteccin </li> <li> Diapositiva 12 </li> <li> En C++ el manejo de excepciones se basa en tres etapas: Intento de ejecucin de cdigo. Si se produce un evento anormal, se lanza la excepcin. La ejecucin del programa se desva a un sitio donde la excepcin es capturada. La manipulacin de excepciones consiste en transferir la ejecucin del programa desde el punto donde se produce la excepcin a un manipulador que coincida con el motivo de la excepcin. C++ utiliza las palabras claves try, throw, catch para el manejo de excepciones. </li> <li> Diapositiva 13 </li> <li> Se especifica un bloque de cdigo cuya ejecucin se va intentar utilizando la palabra clave try Si existe una situacin excepcional durante el intento, se lanza una excepcin y se transfiere el control de ejecucin al punto donde exista un manejador (handler) de excepciones. En el lanzamiento se crea un objeto que es capturado por el handler. Para cada tipo de error se lanzar un tipo diferente de excepcin. Si no se produce una excepcin, el programa sigue el curso normal. Sintaxis: try{ //bloque de intento; donde se puede producir la excepcin } </li> <li> Diapositiva 14 </li> <li> Se detecta una circunstancia excepcional dentro del bloque try; se lanza una excepcin mediante la ejecucin de la sentencia throw. C++ especifica que todas las excepciones deben ser lanzadas desde el bloque try. Las excepciones son un objeto que contiene informacin que es capturada por el handler. El "throw" se comporta como un "return". El valor devuelto por el "throw" se asigna al objeto del "catch" adecuado. if (condition) throw exception; </li> <li> Diapositiva 15 </li> <li> Parte del programa denominada manejador o handler. Sitio donde continua el programa en caso de que ocurra una situacin excepcional. Debe existir al menos un manejador inmediatamente despus de un bloque try. Sintaxis: try { . }catch( ){ . } Los tipos de la expresin del "throw" y el especificado en el "catch" deben coincidir. Si no hay un "catch" adecuado, se abandona el programa. Existe un "catch" general, que captura cualquier "throw" para el que no exista un "catch. catch(...) { //bloque de instrucciones } </li> <li> Diapositiva 16 </li> <li> Bloque try: Donde se incluye el cdigo que puede producir la excepcin. Uno o varios manipuladores asociados al bloque "try", cada uno de esos manipuladores empiezan con la palabra "catch", y entre parntesis una referencia o un objeto Tambin debe existir una expresin "throw", dentro del bloque "try". Cuando la excepcin es estandar, el throw es implcita. Hay casos en que el "throw" es explcito. </li> <li> Diapositiva 17 </li> <li> Diapositiva 18 </li> <li> Lo que sucede es lo siguiente: El valor devuelto por el "throw" se asigna al objeto del "catch" adecuado. En este ejemplo, al tratarse de un carcter, se asigna a la variable 'c', en el "catch" que contiene un parmetro de tipo char. </li> <li> Diapositiva 19 </li> <li> En el caso del operador new si se produce una excepcin, se hace un "throw" de un objeto de la clase std::bad_alloc. Como no estamos interesados en ese objeto, slo usamos el tipo, sin nombre. </li> <li> Diapositiva 20 </li> <li> Diapositiva 21 </li> <li> El manipulador puede ser invocado por un "throw" que se encuentre dentro del bloque "try" asociado, o en una de las funciones llamadas desde l. Cuando se produce una excepcin se busca un manipulador apropiado en el rango del "try" actual. Si no se encuentra se retrocede al anterior, de modo recursivo, hasta encontrarlo. Cuando se encuentra se destruyen todos los objetos locales en el nivel donde se ha localizado el manipulador, y en todos los niveles por los que hemos pasado. </li> <li> Diapositiva 22 </li> <li> Diapositiva 23 </li> <li> En este ejemplo podemos comprobar que a pesar de haber hecho el "throw" en el tercer nivel del "try", el "catch" que lo procesa es el del primer nivel. Los tipos de la expresin del "throw" y el especificado en el "catch" deben coincidir, o bien, el tipo del catch debe ser una clase base de la expresin del "throw". La concordancia de tipos es muy estricta, por ejemplo, no se considera como el mismo tipo "int" que "unsigned int". Si no se encontrase ningn "catch" adecuado, se abandona el programa, del mismo modo que si se produce una excepcin y no hemos hecho ningn tipo de manipulacin de excepciones. Los objetos locales no se destruyen, etc. </li> <li> Diapositiva 24 </li> <li> Existe un "catch" general, que captura cualquier "throw" para el que no exista un "catch. catch(...) { //bloque de instrucciones } </li> <li> Diapositiva 25 </li> <li> Clase base "exception" de la que podemos heredar nuestras propias clases derivadas para pasar objetos a los manipuladores. Declarada en la librera exception class exception { public: exception() throw() { } //constructor virtual ~exception() throw(); //destrctor virtual const char* what() const throw(); /*devuelve el motivo de la excepcion*/ }; "throw()" sirve para indicar que estas funciones no pueden producir ningn tipo de excepcin, es decir, que no contienen sentencias "throw". </li> <li> Diapositiva 26 </li> <li> Una funcin recibe el requerimiento de insercin de un nmero en la posicin n de un vector. La funcin descubre que n es mayor que el tamao del vector, por lo tanto lanza o enva un excepcin, la cual hace retornar inmediatamente la funcin al segmento de cdigo llamador. EL cdigo llamador presumiblemente repite el lazo solicitando un nuevo ndice y vuelve a llamar a la funcin. </li> <li> Diapositiva 27 </li> <li> La funcin Insert usa la sentencia throw para retornar tan pronto como se detecta que el ndice es muy grande. El throw causa el retorno inmediato de la funcin. void Insert( vector &amp; array, int index, int value ) { if( index = array.size()) throw string("Index out of bounds in Insert()"); array[index] = value; } // more... </li> <li> Diapositiva 28 &gt; index; Insert( scores, index, value ); cout </li><li> Ahora la funcin llamadora puede nombrar un tipo de excepcin especfico en la sentencia catch. try { cout </li> <li> Algunas veces es til lanzar una excepcin nuevamente y dejar que la funcin previa en la cadena se haga cargo de su manejo. void TestVector(vector &amp; scores,int value) { int index; try { cout </li></ul>