11.07.2015 Views

Manejo de Excepciones

Manejo de Excepciones

Manejo de Excepciones

SHOW MORE
SHOW LESS
  • No tags were found...

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Manejo</strong> <strong>de</strong> <strong>Excepciones</strong>Lectura sugerida <strong>de</strong> texto en linea:• Eckel, Bruce. Thinking About C++, 2ndEdition, Prentice-Hall, 2000. Free atwww.bruceeckel.com.Agustin J. GonzalezELO326: Seminario II2do. Sem. 2001


<strong>Manejo</strong> <strong>de</strong> <strong>Excepciones</strong>• El <strong>Manejo</strong> <strong>de</strong> <strong>Excepciones</strong> es un mecanismointerno para comunicar estados <strong>de</strong> error <strong>de</strong>s<strong>de</strong> unaparte <strong>de</strong>l programa a otra.• Comúnmente, una parte <strong>de</strong>l programa <strong>de</strong>tecta unaerror, pero no es conveniente mezclar lassituaciones <strong>de</strong> excepcion con el flujo normal y masprobable <strong>de</strong>l programa.• Otra parte <strong>de</strong>l programa pue<strong>de</strong> hacerse cargo <strong>de</strong>todos los errores, pero estos no se generan en esaseccion <strong>de</strong>l codigo.


Situación común• Una función recibe el requerimiento <strong>de</strong> inserción <strong>de</strong>un número en la posición n <strong>de</strong> un vector. La función<strong>de</strong>scubre que n es mayor que el tamaño <strong>de</strong>l vector,por lo tanto lanza o envía un excepción, la cualhace retornar inmediatamente la función alsegmento <strong>de</strong> código llamador.• EL código llamador presumiblemente repite el lazosolicitando un nuevo índice y vueleve a llamar a lafunción.


Función Insert() en el escenario previoLa función Insert usa la sentencia throw para retornartan pronto como se <strong>de</strong>tecta que el índice es muygran<strong>de</strong>. El throw causa el retorno inmediato <strong>de</strong> lafunción.void Insert( vector & array, int in<strong>de</strong>x,int value ){if( in<strong>de</strong>x < 0 || in<strong>de</strong>x >= array.size())throw string("In<strong>de</strong>x out of bounds in Insert()");}array[in<strong>de</strong>x] = value;// more...


• El bloque try ro<strong>de</strong>a cada sección <strong>de</strong> código siendoprobado.• Una o más sentencias catch siguen al bloque try.try {cout


Clases para excepciones• Po<strong>de</strong>mos <strong>de</strong>finir nuestras propias clases para manejo<strong>de</strong> excepciones. Ésta <strong>de</strong>fine el tipo <strong>de</strong> objeto lanzadocuando una excepción ocurre.• La clase excepción usualmente lleva por nombre laexcepción, por ejemplo RangeException.class RangeException { };// use for out of range subscripts


Clases Excepción• Esta versión <strong>de</strong> la función Insert construye y lanzaun objeto RangeException si el índice está fuera <strong>de</strong>lrango.void Insert( vector & array, int in<strong>de</strong>x,int value ){if( in<strong>de</strong>x < 0 || in<strong>de</strong>x >= array.size())throw RangeException();}array[in<strong>de</strong>x] = value;Paréntesis son requeridos!


Atrapando una Excepción• Ahora la función llamadora pue<strong>de</strong> nombrar un tipo<strong>de</strong> excepción específico en la sentencia catch.try {cout


Atrapando múltiples <strong>Excepciones</strong>Usamos múltiples sentencias catch para atrapar todoslos tipos <strong>de</strong> excepciones que pue<strong>de</strong>n ser lanzadas.try {DoOneThing();DoAnother();DoSomethingElse();}catch( RangeException & ) {cout


Clase RangeExceptionUna mejor versión <strong>de</strong> la clase RangeException nospermite pasar un string a su contructor. También hay unmétodo GetMsg que retorna el mismo string.class RangeException {public:RangeException(const string & msg){ m_sMsg = msg; }string GetMsg() const{ return m_sMsg; }private:string m_sMsg;};


Clase RangeExceptionCuando la función Insert <strong>de</strong>tecta un índice errado,ésta pasa un string al constructor theRangeException.void Insert( vector & array, int in<strong>de</strong>x,int value ){if( in<strong>de</strong>x < 0 || in<strong>de</strong>x >= array.size())throw RangeException("In<strong>de</strong>x out of bounds ""in Insert()");}array[in<strong>de</strong>x] = value;


Clase RangeExceptionCuando el llamador atrapa la excepción enviada porInsert, éste ahora pue<strong>de</strong> llamar GetMsg para <strong>de</strong>splegar elmensaje almacenado en el string.try {cout


Re-envío <strong>de</strong> un ExcepciónAlgunas veces es útil lanzar una excepción nuevamentey <strong>de</strong>jar que la función previa en la ca<strong>de</strong>na se haga cargo<strong>de</strong> su manejo.void TestVector(vector & scores,int value){int in<strong>de</strong>x;try {cout


Re-envío <strong>de</strong> excepcionesEn este ejemplo la función llamadora <strong>de</strong>be tener unasentencia catch para atrapar la excepción enviada porTestVector.void Example2(){vector scores(VECSIZE);int value = 99;}try {TestVector( scores, value );}catch( RangeException & R ) {cout


Envío <strong>de</strong> Múltiples <strong>Excepciones</strong>Una misma función pue<strong>de</strong> lanzar más <strong>de</strong> unaexcepción. Ejemplo:void Insert( vector & array, int in<strong>de</strong>x,int value ){if( in<strong>de</strong>x < 0 || in<strong>de</strong>x >= array.size())throw RangeException("In<strong>de</strong>x out of bounds ""in Insert()");if( value < 0 )throw BadArrayValue();}array[in<strong>de</strong>x] = value;


Capturando <strong>Excepciones</strong> DesconocidasSi una excepción es lanzada en algún lugar en laca<strong>de</strong>na <strong>de</strong> llamados a función y nunca es atrapada,ésta pue<strong>de</strong> ser capturada usando (...) como elparámetro <strong>de</strong> la sentencia try-catch.void main(){try {Example2();}catch( ... ) {cout


Fin

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!