Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Unidad 5
Excepciones
Es posible que, al ejecutar un programa, se presenten
errores no esperados que alteren el funcionamiento del
mismo o incluso obligando a su finalización. Estos errores
no tienen por qué deberse a errores de programación, sino
que también pueden aparecer por un uso no esperado del
programa por parte del usuario (introducir datos no
permitidos, indicar un archivo no existente...).
Podemos evitar los errores prediciendo futuras entradas de
datos erróneas o bien podemos tratarlos cuando surjan. Para
ello, la Plataforma .NET suministra la clase Exception del
espacio de nombres System.
Excepciones y control de excepciones
Como se verá, utilizando excepciones es posible escribir el código como si nunca se fuesen a
producir errores y dejar en una zona aparte todo el código de tratamiento de errores, lo que
contribuye a facilitar la legibilidad de los fuentes.
Ventajas
Más información: A partir del valor de un código de error
puede ser difícil deducir las causas del mismo y conseguirlo
muchas veces implica tenerse que consultar la documentación
que proporcionada sobre el método que lo provocó, que puede
incluso que no especifique claramente su causa.
Por el contrario, una excepción es un objeto que cuenta con
campos que describen las causas del error y a cuyo tipo suele
dársele un nombre que resuma claramente su causa. Por ejemplo,
para informar errores de división por cero se suele utilizar una
excepción predefinida de tipo DivideByZeroException en cuyo
campo Message se detallan las causas del error producido.
Ventajas
Tratamiento asegurado: Cuando se utilizan códigos de error
nada obliga a tratarlos en cada llamada al método que los pueda
producir, e ignorarlos puede provocar más adelante en el código
comportamientos inesperados de causas difíciles de descubrir.
Cuando se usan excepciones siempre se asegura que el
programador trate toda excepción que pueda producirse o que,
si no lo hace, se aborte la ejecución de la aplicación
mostrándose un mensaje indicando dónde se ha producido el
error.
Excepciones derivadas de System.Exception que se corresponden con los errores más
comunes que pueden surgir durante la ejecución de una aplicación.
int
interrorCodigo
errorCodigo==0;0;
FileInfo
FileInfosource
source==new
newFileInfo("code.cs");
FileInfo("code.cs");
ifif(errorCodigo
(errorCodigo== ==-1)
-1)goto
gotoFallo;
Fallo;
int
intlongitud
longitud==(int)source.Length;
(int)source.Length;
ifif(errorCodigo
(errorCodigo== ==-2)
-2)goto
gotoFallo;
Fallo;
char[]
char[]contenido
contenido==new newchar[longitud];
char[longitud];
ifif(errorCodigo
(errorCodigo== ==-3)
-3)goto
gotoFallo;
Fallo;
////No
Nohay
hayproblemas
problemas......
Fallo:
Fallo:...... Trat.
Trat. De
De errores
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.");
}
}
}
Uso de bloques try-catch
Solución orientada a objetos para el
tratamiento de errores
Poner el código normal en un bloque try
Tratar las excepciones en un bloque catch aparte
try Lógica
Lógica del
delprograma
try{{ programa
Console.WriteLine("Escriba
Console.WriteLine("Escribaun unnúmero");
número");
int
intii==int.Parse(Console.ReadLine());
int.Parse(Console.ReadLine()); Tratamiento
Tratamiento de
de errores
errores
}}
catch
catch(OverflowException
(OverflowExceptioncapturada)
capturada)
{{
Console.WriteLine(capturada);
Console.WriteLine(capturada);
}}
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
try
{{
Console.WriteLine(“Escriba
Console.WriteLine(“Escribaelelprimer
primernúmero");
número");
int
intii==int.Parse(Console.ReadLine());
int.Parse(Console.ReadLine());
Console.WriteLine("Escriba
Console.WriteLine("Escribaelelsegundo
segundonúmero");
número");
int
intjj==int.Parse(Console.ReadLine());
int.Parse(Console.ReadLine());
int
intkk==ii//j;j;
}}
catch
catch(OverflowException
(OverflowExceptioncapturada)
capturada){…}
{…}
catch
catch(DivideByZeroException
(DivideByZeroExceptioncapturada)
capturada){…}
{…}
El siguiente código ayudará a comprender mejor lo que
ocurre en un bloque try-catch múltiple:
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 instrucción throw
Lanza una excepción apropiada
Asigna a la excepción un mensaje significativo
throw
throwexpression
expression;;
ifif(minuto
(minuto<<11||||minuto
minuto>=>=60)
60){{
throw
thrownewnewInvalidTimeException(minuto
InvalidTimeException(minuto++
""no
noes
esun
unminuto
minutoválido");
válido");
////!!!!No
Noalcanzado
alcanzado!!!!
}}
La cláusula finally
Las instrucciones de un bloque finally se ejecutan
Monitor.Enter(x);
Monitor.Enter(x);
try
try{{
...... Bloques
Bloques catch
catch opcionales
opcionales
}}
finally
finally{{
Monitor.Exit(x);
Monitor.Exit(x);
}}
Comprobación de desbordamiento aritmético
checked
checked{{ OverflowException
OverflowException
int
intnumero
numero==int.MaxValue;
int.MaxValue;
Console.WriteLine(++numero);
Console.WriteLine(++numero); Se lanza un objeto excepción.
}} WriteLine no se ejecuta
unchecked
unchecked{{
int
intnumero
numero==int.MaxValue;
int.MaxValue; MaxValue + 1 es negativo?
Console.WriteLine(++numero);
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
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
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;
}
}
Clausula catch
Cláusula catch
La cláusula catch puede ser utilizada sin argumentos, la cual captura cualquier tipo de excepción.
El bloque finally siempre se ejecuta, independiente del resultado del bloque try.
}
// 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." );
}
}