1 ELO3291 Manejo de Excepciones Lectura sugerida de texto en linea: Eckel, Bruce. Thinking About C++, 2nd Edition, Prentice-Hall, 2000. Gratis en www.bruceeckel.com. www.bruceeckel.com Agustin J. Gonzalez ELO329
2 2 Manejo de Excepciones El Manejo de Excepciones es un mecanismo interno para comunicar estados de error desde una parte del programa a otra. Comúnmente, una parte del programa detecta una error, pero no es conveniente mezclar las situaciones de excepcion con el flujo normal y mas probable del programa. Otra parte del programa puede hacerse cargo de todos los errores, pero estos no se generan en esa seccion del codigo.
3 ELO3293 Situación común Una función recibe el requerimiento de inserción de un número en la posición n de un vector. La función descubre que n es mayor que el tamaño del vector, por lo tanto lanza o envía un excepción, la cual hace retornar inmediatamente la función al segmento de código llamador. El código llamador presumiblemente repite el lazo solicitando un nuevo índice y vuelve a llamar a la función.
4 ELO3294 Función Insert() en el escenario previo void Insert( vector & array, int index, int value ) { if( index = array.size()) throw string("Index out of bounds in Insert()"); array[index] = value; } // more... La función 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 función.
5 ELO3295 try { cout
6 ELO3296 Clases para excepciones class RangeException { }; // use for out of range subscripts Podemos definir nuestras propias clases para manejo de excepciones. Ésta define el tipo de objeto lanzado cuando una excepción ocurre. La clase excepción usualmente lleva por nombre la excepción, por ejemplo RangeException.
7 ELO3297 Clases Excepción void Insert( vector & array, int index, int value ) { if( index = array.size()) throw RangeException(); array[index] = value; } Esta versión de la función Insert construye y lanza un objeto RangeException si el índice está fuera del rango. Paréntesis son requeridos!
8 ELO3298 Atrapando una Excepción try { cout
9 ELO3299 Atrapando múltiples Excepciones try { DoOneThing(); DoAnother(); DoSomethingElse(); } catch( RangeException & ) { cout
10 ELO32910 Clase RangeException class RangeException { public: RangeException(const string & msg) { m_sMsg = msg; } string GetMsg() const { return m_sMsg; } private: string m_sMsg; }; Una mejor versión de la clase RangeException nos permite pasar un string a su contructor. También hay un método GetMsg que retorna el mismo string.
11 ELO32911 Clase RangeException void Insert( vector & array, int index, int value ) { if( index = array.size()) throw RangeException("Index out of bounds \ in Insert()"); array[index] = value; } Cuando la función Insert detecta un índice errado, ésta pasa un string al constructor the RangeException.
12 ELO32912 Clase RangeException try { cout
13 ELO32913 Re-envío de un Excepción void TestVector(vector & scores,int value) { int index; try { cout
14 ELO32914 Re-envío de excepciones void Example2() { vector scores(VECSIZE); int value = 99; try { TestVector( scores, value ); } catch( RangeException & R ) { cout
15 ELO32915 Envío de Múltiples Excepciones void Insert( vector & array, int index, int value ) { if( index = array.size()) throw RangeException("Index out of bounds " "in Insert()"); if( value < 0 ) throw BadArrayValue(); array[index] = value; } Una misma función puede lanzar más de una excepción. Ejemplo:
16 ELO32916 Capturando Excepciones Desconocidas void main() { try { Example2(); } catch(... ) { cout
17 ELO32917 Fin