Excepciones Las excepciones son señales (en forma de objeto) que se generan en ejecución en casos de errores, para que puedan ser gestionadas en el programa.

Slides:



Advertisements
Presentaciones similares
Introducción a C#.
Advertisements

Ayudantía Pre-Actividad 5 Multimedios. Ayudantía Pre-Actividad 5 (1) creación de varias clases, y composición (2) manejo de threads (3) manejo de excepciones.
Exceptions y Assertions Introducción a la terminología Bloques: try, catch Uso de finally Bloques: try, catch, finally Categorías de Exceptions Excepciones.
Curso de java básico (scjp)
Archivos de Texto. Introducción Los archivos son una secuencia de bits que se guarda en el disco duro. La ventaja de utilizar archivos es que los datos.
EXCEPCIONES UNIDAD 5.
Programación Interactiva Manejo de Excepciones
Instrucciones y excepciones
Manejo de errores y excepciones
Uso de variables de tipo referencia
Lenguaje de programación Java
Programación en Java Instructor:.
Funciones. Programación, Algoritmos y Estructuras de Datos.
MANEJO DE EXCEPCIONES EN C++
POO en C++: Sintaxis En el .h debe aparecer la declaración de la clase: class NombreClase { private: // atributos y métodos privados public: // atributos.
Arquitectura CLARO-TECNOTREE CAPITULO 4: Excepciones
Capitulo 4 Excepciones.
Siguiente Excepciones Introducción. AnteriorSiguiente Definición Una excepción es un evento que ocurre durante la ejecución de un programa que desestabiliza.
Informática II Prof. Dr. Gustavo Patiño MJ
Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2.
PROGRAMACIÓN MULTIMEDIA
UNIVERSIDAD LATINA (UNILA)
EXCEPCIÓN DE ERRORES.
RMI (Remote Method Invocation)
Excepciones y archivos Info 033. Exception El término Exception es la palabra corta para la frase "evento excepcional." Definition: Una excepción es un.
Manejo de excepciones en Java
Tema 7: Polimorfismo Antonio J. Sierra. Índice Introducción. Sobrecarga de métodos. Objetos como parámetros. Paso de argumentos. Devolución de objetos.
Subrutinas.
Mejoras de C++ Builder. –Las nuevas palabras reservadas que Builder le agrega a C++. –Nueva area de visualización de las clases en C++ Builder. –¿Cómo.
INSTITUTO TECNOLOGICO DE TEHUACAN Ingeniería en sistemas computacionales Curso de apoyo a la titulación EXCEPCIONES EN JAVA Diciembre de 2008.
Compiladores II ( /04/ :03) Tema 2. Generación de Código para Estructuras Complejas Lecciones 3 y 4.
Clases y objetos La unidad fundamental de programación OO son las clases. Conjunto de métodos y semántica Qué se va a hacer POO Clase: que define la implementación.
Tema 6: Clases Antonio J. Sierra.
Igor Santos Grueiro. Ahora tenemos datos y datos …
Manejo de Excepciones Agustín J. González ELO329.
Semana 5 Subprogramas..
Capítulo 1 “Elementos de Programación”
Conversión cadena a número
Tema 11: Excepciones Antonio J. Sierra.
Lenguaje Java Fundamentos del lenguajes de programación
El lenguaje de programación Java
Computación II Unidad X Manejo de Excepciones. Presentación de la Unidad Objetivos: –Saber manejar situaciones inesperadas dentro de un programa –Comprender.
USO DE EXCEPCIONES EN JAVA LSC. Natalia Rodríguez Castellón.
SCJP SUN CERTIFIED PROGRAMMER FOR JAVA 6. SCJP 6.0 SEMANA CUATRO CONTROL DE FLUJOS, EXCEPCIONES Y ASERSIONES.
Módulo 8: Manejo de Errores y Excepciones
Programación Orientada a Objetos Unidad 4 Excepciones Universidad de Chile Departamento de Ciencias de la Computación.
ING.CIP.IVAN PETRLIK AZABACHE. SEMANA 4 MANEJO DE EXCEPCIONES Y ERRORES.
Excepciones Unidad 5.
1 Manejo de Excepciones y otros Agustín J. González ELO-329.
Java.
ELO3291 Manejo de Excepciones Lectura sugerida de texto en linea: Eckel, Bruce. Thinking About C++, 2nd Edition, Prentice-Hall, Gratis en
Programación avanzada en Java Miguel Ángel Corella 26 de Septiembre de 2005.
Programación orientada a objetos Capítulo 12 Manejo de errores.
Tratamiento de excepciones
ELO3291 Manejo de Excepciones Agustín J. González ELO329.
MANEJO DE EXCEPCIONES. 21/11/2005 E.T.S de Ingenieros de Telecomunicacion.2 Índice ¿Qué es una excepción? Tipos de situaciones. Manejo de excepciones.
¿Qué son? – tipos – manejo - ejemplos
Metodología de Programación Ayudantía 4 lelagos.ublog.cl 2009.
Desarrollador Profesional de Juegos Programación III Unidad I El manejador universal.
Ada 2º Parte (variables, ámbitos, subrutinas, tipos abstractos de datos y excepciones)
:: Prof. Yeniffer Peña Programación I Programación Orientada a Objetos Presentación.
Desarrollador Profesional de Juegos Programación III Unidad I Capturar Excepciones.
ECOM-6030 CAPÍTULO 7 EXCEPTION HANDLING Prof. Nelliud D. Torres © - Derechos Reservados.
Desarrollador Profesional de Juegos Programación III Unidad I Excepciones Tipos.
SCITMina | by Microsoft Bienvenidos Eduardo Daniel Tenorio Mayo Microsoft Student Partner Taller de Programación Orientada a Objetos Con C# Edgar Edel.
:: Prof. Yeniffer Peña Programación I Programación Orientada a Objetos Presentación.
1 Métodos. 2 Un método es un conjunto de instrucciones definidas dentro de una clase, que realizan una determinada tarea y a las que podemos invocar mediante.
Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Práctica 4 Versión Diseño de tipos Igualdad, representación, código,
Métodos en Java. Estructura de un programa en Java ► La relación con la vida misma la podemos ver en el siguiente comentario: Imaginemos que dos clases.
Excepciones Diseño y manejo de excepciones Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Práctica 5 Versión
Transcripción de la presentación:

Excepciones Las excepciones son señales (en forma de objeto) que se generan en ejecución en casos de errores, para que puedan ser gestionadas en el programa. Son un mecanismo para el tratamiento de errores alternativo a los condicionales y las funciones booleanas. Las excepciones se clasifican por tipos formando jerarquías de clases de excepciones. Además, normalmente transmiten un mensaje indicando el error ocurrido. En C++ estándar, la raíz de la jerarquía es exception. En C++ Builder, la raíz de la jerarquía es Exception.

Excepciones Las excepciones pueden ser controladas por el programador. Se pueden lanzar y capturar. Cuando se genera (se lanza o eleva) una excepción, se transmite automáticamente a través de la pila de llamadas a funciones hasta que es tratada (capturada o interceptada). Las excepciones deben de tratarse procurando que la aplicación pueda seguir ejecutándose con el menor daño posible, o si no terminando la ejecución del programa. En general, la función que lanza la excepción puede estar en una determinada unidad o librería, y el código que la trata en otra.

Excepciones: Ejemplo La función StrToInt(AnsiString) genera una excepción si la cadena que recibe por parámetro no representa sintácticamente un entero válido. Así StrToInt("12.9") o StrToInt("12a") generan una excepción del tipo EConvertError que indica que no se puede convertir el AnsiString a un valor entero. Por tanto, al utilizar esta función deberíamos tener en cuenta esta posibilidad cuando no estemos seguros de que la cadena es válida, como cuando la cadena es un dato que se pide al usuario.

Excepciones: Lanzamiento Para lanzar una excepción: throw ConstructoraClase(Argumentos); throw crea un objeto del tipo indicado invocando a la constructora.

Excepciones: Lanzamiento class ExcepFich{ public: AnsiString mensaje; ExcepFich(AnsiString m){mensaje=m;} }; virtual void cargar(ifstream& fich){ string cadena; fich >> cadena; if (cadena!=\\Xini) throw ExcepFich(Error de lectura); else.... }

Excepciones: Sintaxis En el.h se deben indicar que métodos van a lanzar excepciones y de qué tipo van a ser éstas. Tipo nombreMetodo(argumentos) throw (A,B,C,...); A,B,C,.. son nombres de clases. En el.cpp: Tipo nombreMetodo(argumentos) throw (A,B,C,...){..}; Si no se pone nada puede lanzar excepciones de cualquier tipo.

Excepciones: Sintaxis En el.h: virtual void cargar(ifstream& fich) throw (ExcepFich); En el.cpp: void Linea::cargar(ifstream& f) throw (ExcepFich) {.....};

Excepciones: Captura y control try { // código que puede generar excepciones } catch (Clase 1 [& Var 1 ]) {// tratamiento de excepciones de tipo Clase 1 } catch (Clase 2 [& Var 2 ]) {// tratamiento de excepciones de tipo Clase 2 }..... catch (Clase N [& Var N ]) {// tratamiento de excepciones de tipo Clase N }

Excepciones: Captura y control Según se va subiendo por la pila de llamadas en busca de bloques try, sus correspondientes cláusulas catch se prueban secuencialmente en busca de una concordancia. Mientras no se encuentre la concordancia, seguimos subiendo por la pila de llamadas. Una concordancia se da cuando la excepción lanzada es una instancia directa o indirecta (subclase) de la especificada en el parámetro del catch. La siguiente instrucción a un bloque try-catch es la siguiente instrucción que aparece después de todos las cláusulas catch.

Excepciones: Captura y control class Error{}; // p1 y q1 no hacen nada void principal(){ try {p1(); p2();p3(); } catch (Error) {ShowMessage(Capturada en principal");} ShowMessage("Sigo ejecutando por aquí (principal)");} void p2(){ p1(); try {q1();q2();q3();} catch (Error) {ShowMessage("Capturada en p2");} ShowMessage("Sigo ejecutando por aquí (p2)");}; void p3(){ ShowMessage(Si que ejecuto p3");}; void q2(){try {throw Error();} catch (Error){ShowMessage("Capturada en q2");}; ShowMessage("Sigo ejecutando por aquí (q2)"); } void q3(){ ShowMessage(Si que ejecuto q3");};

Excepciones: Captura y control Se muestra por pantalla: Capturada en q2 Sigo ejecutando por aquí (q2) Si ejecuto q3 Sigo ejecutando por aquí (p2) Si ejecuto p3 Sigo ejecutando por aquí (principal)

Excepciones: Captura y control class Error{}; class Error1{};// p1 y q1 no hacen nada void principal(){ try {p1(); p2();p3(); } catch (Error) {ShowMessage(Capturada en principal");} ShowMessage("Sigo ejecutando por aquí (principal)");} void p2(){ p1(); try {q1();q2();q3();} catch (Error) {ShowMessage("Capturada en p2");} ShowMessage("Sigo ejecutando por aquí (p2)");}; void p3(){ ShowMessage(Si que ejecuto p3");}; void q2(){try {throw Error();} catch (Error1) {ShowMessage("Capturada en q2");}; ShowMessage("Sigo ejecutando por aquí (q2)"); }

Excepciones: Captura y control Entonces: Capturada en p2 Sigo ejecutando por aquí (p2) Si ejecuto p3 Sigo ejecutando por aquí (principal)

Excepciones: Captura y control class Error{}; class Error1{}; void principal(){ try {p1(); p2();p3(); } catch (Error) {ShowMessage(Capturada en principal");} ShowMessage("Sigo ejecutando por aquí (principal)");} void p2(){ p1(); try {q1();q2();q3();} catch (Error1) {ShowMessage("Capturada en p2");} ShowMessage("Sigo ejecutando por aquí (p2)");}; void q2(){try {throw Error();} catch (Error1) {ShowMessage("Capturada en q2");}; ShowMessage("Sigo ejecutando por aquí (q2)"); }

Excepciones: Captura y control void q1(){ try {} catch (Error){ShowMessage("Capturada en q1");} ShowMessage("Sigo ejecutando por aquí (q1)"); }; void p1(){ try {} catch (Error) {ShowMessage("Capturada en p1");} ShowMessage("Sigo ejecutando por aquí (p1)"); };

Excepciones: Captura y control Entonces: Sigo ejecutando por aquí (p1) Sigo ejecutando por aquí (q1) Capturada en principal Sigo ejecutando por aquí (principal)

Excepciones: Captura y control class Error{}; void principal(){ try {p2(); p3();} catch (Error){ShowMessage(Capturada en principal");} ShowMessage("Sigo ejecutando por aquí (principal)");} void p2(){ p1(); try {q1();q2();q3();} catch (Error){ShowMessage("Capturada en p2");} ShowMessage("Sigo ejecutando por aquí (p2)");}; void p1(){ throw Error();}

Excepciones: Captura y control Capturada en principal Sigo ejecutando por aquí (principal)

Excepciones: Captura y control Cuando creamos una aplicación nueva, las excepciones que no sean capturadas por el programador, siempre son controladas por la aplicación: Por las propias librerías gráficas. O por la aplicación (en caso de excepciones propias del Builder).

Excepciones: Captura y control WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try { Application->Initialize(); Application->CreateForm(__classid(TForm1), &Form1); Application->Run(); } catch (Exception &exception) // excepciones del Builder { Application->ShowException(&exception); } return 0; }

Excepciones: Captura y control Cuando se captura una excepción, el objeto de la excepción es destruido. En una cláusula catch se puede declarar una variable local ([&Var]) cuyo ámbito es el bloque del tratamiento. Como es un objeto, podemos hacer con él lo que con cualquier otro objeto de esa clase. En una cláusula catch se puede volver a lanzar la misma excepción mediante throw. Para capturar cualquier tipo de excepción: catch(...){//tratamiento}

Excepciones: Captura y control void TForm1::p1(){ try{ p2();} catch (const Error& E){ ShowMessage(E.mensaje); ShowMessage("Capturada en principal");}}; // void TForm1::p2(){ try{ p3();} catch (...){throw;} }; // void TForm1::p3(){ try{ p4();} catch(...){throw;}}; // void TForm1::p4(){ throw Error("lanzada excepcion en p4");};

Excepciones: La clase Exception C++Builder contiene muchas clases predefinidas para lanzar excepciones. Todas ellas derivan de la clase Exception. Para capturar una excepción de la clase Exception o de alguna de sus derivadas hay que usar la sintaxis: catch (const Exception &Variable) Una de las distintas constructoras de Exception es: Exception(const AnsiString Msg);

Excepciones: La clase Exception Podemos por tanto lanzar este tipo de excepciones con: throw Exception( ); Cuando las capturamos vía un: catch (const Exception &Variable) Podemos acceder a su mensaje utilizando la propiedad Message: Variable.Message

Excepciones: La clase Exception Si ha sido el propio sistema el que ha lanzado la excepción, también podemos capturar el mensaje que contiene. En este caso el mensaje es el nombre de una subclase de Exception (el tipo del objeto excepción lanzado). Entre la subclases de Exception destacamos: EAccessViolation : Acceso de memoria incorrecto. EConvertError : Error de conversión de tipos. EDivByZero : división entre cero. EInOutError : Error de Entrada/salida. En la ayuda pueden encontrarse todas.

Excepciones: La clase Exception void p() { throw Exception(excepción provocada); } void principal() { try {p();} catch (const Exception &E){ShowMessage(E.Message);} } Se captura la excepción lanzada por p() y se muestra el mensaje excepción provocada

Excepciones: La clase Exception void p() { int n1=5; int n2=0; int n3=n1/n2; // lanza una excepción de división entre 0 } void principal() { try {p();} catch (const Exception &E){ShowMessage(E.Message);} } Se captura la excepción lanzada por p() y se muestra el mensaje EDivByZero

Excepciones: La clase Exception void p() { int n1=5; int n2=0; int n3=n1/n2; // lanza una excepción de división entre 0 } void principal() { try {p();} catch (const EDivByZero &E ){ShowMessage(división entre 0);} } Se captura la excepción lanzada por p() y se muestra el mensaje división entre 0

Excepciones: Un ejemplo

Tipos de errores que pueden aparecer: Errores de conversión de tipos (de String a Entero). División entre 0

Excepciones: Un ejemplo void __fastcall TForm1::BotonOKClick(TObject *Sender) { try { int n1=StrToInt(EditPrimerEntero->Text); int n2=StrToInt(EditSegundoEntero->Text); ShowMessage(n1/n2); Close(); } catch (const EConvertError &E) {ShowMessage("Error de conversión"); } catch (const EDivByZero &E) {ShowMessage("División entre 0");} }

Excepciones: Un ejemplo Se hace un mal control de los posibles errores ya que no se muestra información sobre el dato que ha sido mal introducido. ¿Qué pasaría si tuviéramos 100 datos para introducir? ¡¡¡¡ Sería razonable lanzar la excepción en cuanto se detecte que un dato ha sido mal introducido !!!!

Excepciones: Un ejemplo void __fastcall TForm1::BotonOKClick(TObject *Sender) { try { int n1=StrToInt(EditPrimerEntero->Text); continuaPidiendoDatos(n1); } catch (const EConvertError &E) {ShowMessage("Meta un entero como primer entero"); ActiveControl=EditPrimerEntero; EditPrimerEntero->Text=""; LabelPrimerEntero->Font->Color=clBlue;} }

Excepciones: Un ejemplo void TForm1::continuaPidiendoDatos(int n1) { try { LabelPrimerEntero->Font->Color=clBlack; int n2=StrToInt(EditSegundoEntero->Text); if (n2==0) throw EDivByZero ("El segundo entero NO puede ser 0"); else {LabelSegundoEntero->Font->Color=clBlack; ShowMessage(n1/n2); Close(); }

Excepciones: Un ejemplo catch (EConvertError &E) { ShowMessage("Meta un entero como segundo entero"); ActiveControl=EditSegundoEntero; EditSegundoEntero->Text=""; LabelSegundoEntero->Font->Color=clBlue; } catch (const EDivByZero &E) { ShowMessage(E.Message); ActiveControl=EditSegundoEntero; EditSegundoEntero->Text=""; LabelSegundoEntero->Font->Color=clBlue;}}}

Excepciones: Último ejemplo for (int i=0; i<n; i++){ try{ Ai; } catch(...){...} } try for (int i=0; i<n; i++) Ai; catch(...){...}