10/10/2009
Manejo y tratamiento de errores y excepciones C# .NET 2005 MCPD Ing. Cecilia Wiesse
MCPD Cecilia Wiesse
Contenido
Tipos de errores Uso del depurador Manejo de excepciones
MCPD Cecilia Wiesse
1
10/10/2009
Tipos de errores
Errores de compilación
Si hay errores de sintaxis de C#, o si no es posible resolver identificadores en un tipo o miembro conocido, la compilación no finalizará correctamente y verá una lista de errores en la Lista de errores (Ventana). Son errores que impiden que el programa se ejecute. http://msdn.microsoft.com/es-es/library/ms173083.aspx
MCPD Cecilia Wiesse
Tipos de errores
Errores en tiempo de ejecución
Los errores en tiempo de ejecución son errores que aparecen mientras se ejecuta el programa. Estos errores aparecen normalmente cuando el programa intenta una operación que es imposible que se lleve a cabo. Ejemplo:
Una división por cero. Raíz de un número negativo.
MCPD Cecilia Wiesse
2
10/10/2009
Tipos de errores
Errores lógicos
Los errores lógicos son errores que impiden que el programa haga lo que estaba previsto. El código puede compilarse y ejecutarse sin errores, pero el resultado de una operación puede generar un resultado no esperado. Ejemplo:
Si se retorna el apellido en lugar del nombre del alumno. Si retorna un stock incorrecto.
MCPD Cecilia Wiesse
Uso del depurador
Se lanza desde la ventana de programación en la cual se puede establecer en cualquier momento un punto de interrupción en una línea de código presionando F9. Al presionarse F5 para ejecutar la aplicación en el depurador de Visual Studio, la aplicación se detendrá en la línea y podrá examinar el valor de las variables, observar cómo o cuándo la ejecución sale de un bucle, recorrer el código línea a línea mediante la tecla F10, F11 o establecer puntos de interrupción adicionales.
MCPD Cecilia Wiesse
3
10/10/2009
Uso del depurador
http://msdn.microsoft.com/es-es/library/ms173083.aspx
MCPD Cecilia Wiesse
Excepciones: tratamiento de errores
El tradicional tratamiento procedural de errores es complicado
Ante un error producido en una función se devuelve un código de error que se analiza al retornar al punto de llamada Este mecanismo tiene problemas para tratar el error en otro módulo diferente a donde se ha producido.
MCPD Cecilia Wiesse
4
10/10/2009
Lógica del programa int errorCodigo = 0; FileInfo source = new FileInfo("code.cs"); if (errorCodigo == -1) goto Fallo; int longitud = (int)source.Length; if (errorCodigo == -2) goto Fallo; char[] contenido = new char[longitud]; if (errorCodigo == -3) goto Fallo; // No hay problemas ... Tratamient o de error
Fallo: …
MCPD Cecilia Wiesse
Excepciones: bloques try-catch
Se incluye el código normal en el bloque try Incluir el código para tratar las excepciones en un bloque catch.
try { Console.WriteLine("Escriba un número"); Lógica del programa int i = int.Parse(Console.ReadLine()); } catch (OverflowException capturada) { Tratamiento Console.WriteLine(capturada); de error } MCPD Cecilia Wiesse
5
10/10/2009
Objetos Exception
Solución orientada a objetos para el tratamiento de errores. Una excepción es una situación que ocurre durante la ejecución del programa y que requiere un tratamiento inmediato. Una vez se genera una excepción, el código puede detectarla y tratarla él mismo o “lanzarla” para que la trate otro módulo. El programador puede crear excepciones propias y que tengan variables para guardar información del error.
MCPD Cecilia Wiesse
Objetos Exception
Jerarquía de objetos: heredan de System.Exception Ejemplos:
InvalidCastException: Convertir objetos incompatibles DivideByZeroException: División por 0 IndexOutOfRangeException: Acceso fuera del rango de una tabla
MCPD Cecilia Wiesse
6
10/10/2009
Excepciones: bloques try-catch
Cada bloque catch captura una clase de excepción Un bloque try puede tener un bloque catch general Un bloque try no puede capturar una clase derivada de una clase de excepción capturada en un bloque catch anterior
MCPD Cecilia Wiesse
Ejemplo: try { Console.WriteLine(“Escriba el primer número"); int i = int.Parse(Console.ReadLine()); Console.WriteLine("Escriba el segundo número"); int j = int.Parse(Console.ReadLine()); int k = i / j; } catch (OverflowException capturada) {…} catch (DivideByZeroException capturada) {…}
MCPD Cecilia Wiesse
7
10/10/2009
Ejemplo: try { Int32 index = 10; while(index-- != 0){ Console.WriteLine(100/index); } } catch(DivideByZeroException) { Console.WriteLine( “Capturada excepción: división x 0"); } Console.WriteLine(“Seguimos ejecutando"); MCPD Cecilia Wiesse
Excepciones: throw
Lanza una excepción apropiada Asigna a la excepción un mensaje significativo.
throw expression ; if (minuto < 1 || minuto >= 60) { throw new InvalidTimeException(minuto + " no es un minuto válido"); // !! Código no alcanzado !! } MCPD Cecilia Wiesse
8
10/10/2009
Excepciones: finally
Si lanzamos una excepción y... existe algún tipo de “clean-up” a realizar: cerrar un fichero, cerrar conexiones, ... Podemos utilizar la sentencia finally que garantiza que ese código siempre se ejecutará Monitor.Enter(x); try { ... } finally { Monitor.Exit(x); } MCPD Cecilia Wiesse
Ejemplo:
try { // Quizás se lanza una excepción // o se ejecuta un return return; } finally { Console.WriteLine( “Código ‘finally’ se ejecuta siempre"); }
MCPD Cecilia Wiesse
9
10/10/2009
Comprobación de desbordamiento aritmético
Por defecto, el desbordamiento aritmético no se comprueba
Un comando checked activa la comprobación de desbordamiento
checked { int numero = int.MaxValue; Console.WriteLine(++numero); }
OverflowException Se lanza un objeto excepción. WriteLine no se ejecuta
MCPD Cecilia Wiesse
Excepciones: normas
Lanzamiento
Evitar excepciones para casos normales o esperados Nunca crear ni lanzar objetos de clase Exception Incluir una cadena de descripción en un objeto Exception Lanzar objetos de la clase de excepción más específica posible
Captura
Ordenar los bloques catch de lo específico a lo general No permitir que salgan excepciones de Main
MCPD Cecilia Wiesse
10