Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Excepciones
Excepciones.
Las excepciones en C# ofrecen un modo estructurado, uniforme y con seguridad de
tipos para el manejo de situaciones de error tanto a nivel de sistema como a nivel de
aplicacin.
El mecanismo de excepciones de C# es similar al de C++, con las siguientes diferencias:
- En C#, las excepciones son instancias de tipos clase derivados de la clase
System.Exception. En C++, cualquier valor de cualquier tipo puede ser
utilizado para representar una excepcin.
- En C#, un bloque finally puede ser utilizado para escribir cdigo que se
ejecute tanto si se da una excepcin como si no se da. En C++ no existe esa
posibilidad si no es duplicando cdigo.
- En C#, las excepciones de sistema tales como desbordamiento, divisin por cero
y desreferencias nulas tienen clases de excepcin bien definidas y condiciones
de error a nivel de aplicacin asociadas.
La clase System.Exception.
La clase System.Exception es el tipo base de todas las excepciones. Entre sus
propiedades ms importantes estn:
- Message: es una propiedad de slo lectura que contiene una descripcin de la
causa de la excepcin (en forma de cadena legible por el ser humano).
- InnerException: es una propiedad de slo lectura que contiene la excepcin
interna de la excepcin. Si su valor es distinto de null, indica que la excepcin
actual ha sido lanzada en respuesta a otra excepcin (que es a la que se llama la
excepcin interna).
El valor de estas propiedades puede ser especificado en el constructor de la clase
System.Exception.
Lanzamiento de Excepciones.
Las excepciones pueden ser lanzadas de dos modos:
- Mediante la sentencia throw: Lanza la excepcin de modo inmediato e
incondicional. En ningn caso vuelve el control a la sentencia siguiente al
throw.
- Durante la ejecucin de sentencias y expresiones C# se pueden dar situaciones
en las que la operacin no pueda completarse de modo normal y se lance una
excepcin. Por ejemplo, una divisin entera por cero lanza la excepcin
System.DivideByZeroException.
Manejo de Excepciones.
Las excepciones se manejan mediante una sentencia try-catch-finally.
Por ejemplo:
1/4
Excepciones
try
{
string s = null;
x.MiFun(s);
}
catch (ArgumentNullException e)
{
Console.WriteLine("{0} Primera excepcin capturada", e);
}
catch (Exception e)
{
Console.WriteLine("{0} Segunda excepcin capturada", e);
}
Cuando se lanza una excepcin desde el cdigo que est entre las llaves de la clusula
try, el sistema busca la primera clusula catch que pueda manejar el tipo de excepcin
que se ha lanzado (el tipo de excepcin ha de coincidir con el del parmetro que espera
la clusula catch o bien ser de un tipo derivado al que espera la clusula catch).
Si no se encuentra la clusula catch adecuada se sigue buscando la excepcin en el
punto del cdigo desde el que se ha llamado al mtodo que contiene la clusula try
donde se ha lanzado la excepcin. Esta operacin se repite hasta encontrar una clusula
catch que maneje (tambin se dice capture) la excepcin.
Es importante tener en cuenta que si se desea que una clusula catch capture cualquier
excepcin ha de definirse sin parmetros.
Una vez se ha encontrado la clusula catch que maneja la excepcin, se transfiere el
control a la primera sentencia de tal clusula. Antes de ejecutar la primera sentencia de
la clusula catch, se ejecutan todas las clusulas finally de las sentencias try
anidadas a la que captura la excepcin.
Si no se encuentra una clusula catch puede ocurrir una de las dos opciones siguientes:
- Si la bsqueda llega a un constructor static o a un inicializador de campos
static, se lanza una excepcin System.TypeInicializationException en el
punto en el que se invoc al constructor. El campo InnerException de la
TypeInicializationException
contiene
la
excepcin
excepcin
originalmente lanzada.
- Si la bsqueda llega al cdigo que inicialmente comenz el thread o el proceso,
la ejecucin del thread o el proceso finaliza.
Ejemplo:
using System;
class MiClase
{
public static void Main()
{
MiClase x = new MiClase();
try
{
string s = null;
2/4
Excepciones
x.MiFun(s);
}
// Captura de la excepcin (ms especfica):
catch (ArgumentNullException e)
{
Console.WriteLine("{0} Primera excepcin capturada ", e);
}
// Captura de la excepcin (menos especfica):
catch (Exception e)
{
Console.WriteLine("{0} Segunda excepcin capturada ", e);
}
}
public void MiFun(string s)
{
if (s == null)
throw new ArgumentNullException();
}
}
La salida es:
Figura 9.1
Causa
Se lanza cuando falla un intento de
reservar memoria mediante el operador
new.
Se lanza cuando la pila de ejecucin se
System.OutOfMemoryException
System.StackOverflowException
3/4
Excepciones
4/4