Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Unidad 5
Excepciones
◻ En el lenguaje C#, los errores del programa se difunden en tiempo de
ejecución a través del programa mediante un mecanismo denominado
excepciones. Las excepciones se producen cuando el código encuentra
un error y se detectan mediante el código que puede corregir el error. Las
excepciones se pueden producir mediante el Common Language Runtime
(CLR) de .NET Framework o mediante código de un programa. Una vez que
se produce una excepción, ésta se difunde a la pila de llamadas hasta que
se encuentra una instrucción catch para la excepción. Las excepciones no
detectadas se identifican a través de un controlador de excepciones
genérico proporcionado por el sistema que muestra un cuadro de diálogo.
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 ...
Fallo: ... Trat. De
errores
Ejemplo
class ExceptionTest
{
static double SafeDivision(double x, double y)
{
if (y == 0)
throw new System.DivideByZeroException();
return x / y;
}
static void Main()
{
// Input for test purposes. Change values
// to see exception handling behavior.
double a = 98, b = 0;
double result = 0;
try
{
result = SafeDivision(a, b);
Console.WriteLine("{0} dividido entre {1} = {2}", a, b, result);
}
catch (DivideByZeroException )
{
Console.WriteLine(“Intentas dividir entre cero.");
}
}
}
Excepciones
◻ Una excepción es el indicador de un problema: una
mala operación o situación anómala que ocurre durante
la ejecución de un programa.
◻ Las excepciones deben ser interceptadas y manejadas
para no desestabilizar el programa.
◻ Todas las excepciones son instancias de
System.Exception o de sus derivadas.
◻ El CLR provee un número amplio de excepciones
predefinidas: ArgumentNullException,
InvalidCastException, OverflowException, etc.
◻ Se pueden crear excepciones personalizadas derivando
de System.Exception.
Manejando las excepciones
◻ Las excepciones deben ser atrapadas y controladas
para asegurar la continuidad del programa.
return (x / y);
}
catch (System.DivideByZeroException dbz)
{
System.Console.WriteLine("Division by zero attempted!");
return 0;
}
}
Bloques catch múltiples
◻ Cada bloque catch captura una clase de excepcion
◻ Un bloque try puede tener un bloque catch general
◻ Un bloque try no puede capturar una clase derivada de
una clase capturada en un bloque catch anterior
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) {…}
Clausula catch
Tipos de catch
Cláusula catch
◻ La cláusula catch puede ser utilizada sin argumentos, la cual captura cualquier tipo de excepción.
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)
{
Console.WriteLine(capturada);
}
catch(DivideByZeroException capturada)
{
Console.WriteLine(capturada);
}
. ...
La cláusula finally
◻ Las instrucciones de un bloque finally se
ejecutan
Monitor.Enter(x);
try {
... Bloques catch opcionales
}
finally {
Monitor.Exit(x);
}
Sentencias try-catch-finally
◻ El bloque finally es útil para limpiar y liberar recursos utilizados en el bloque try. Se puede utilizar para cerrar
conexiones a BD, cerrar
archivos, limpiar el buffer, etc.
◻ Se ejecuta después de la ejecución de los bloques try y catch.
◻ El bloque finally siempre se ejecuta, independiente del resultado del bloque try.
throw expression ;
unchecked {
int numero = int.MaxValue; MaxValue + 1 es negativo?
Console.WriteLine(++numero);
} -2147483648
Normas para el tratamiento de excepciones
◻ 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 más específica posible
◻ Captura
⬜ Ordenar los bloques catch de lo específico a lo
general
⬜ No permitir que salgan excepciones de Main
La Clase System.Exception
◻ PropiedadStackTrace (string / read-only)
⬜ Devuelve una cadena con el nombre de los métodos
de la pila.
⬜ Devuelve el número de línea donde se generó la
excepción en cada método.
◻ PropiedadMessage (string / read-only)
⬜ Devuelve una cadena explicativa de la razón de la
excepción.
◻ PropiedadHelpLink (string / read-only)
⬜ Se puede establecer para devolver un link con
información de ayuda para resolver el problema.
Ejemplos de uso de la clase Exception
}
// most derived exception type first
catch (DivideByZeroException e )
{
Console.WriteLine(“DivideByZeroException! Msg: {0}“,e.Message );
Console.WriteLine(“HelpLink: {0}", e.HelpLink );
Console.WriteLine(“Here's a stack trace: {0}\n“, e.StackTrace );
}
catch
{
Console.WriteLine("Unknown exception caught" );
}
finally
{
Console.WriteLine("Close file here." );
}
}