Está en la página 1de 4

Marco Besteiro y Miguel Rodrguez

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

Marco Besteiro y Miguel Rodrguez

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

Marco Besteiro y Miguel Rodrguez

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

Clases de Excepcin ms comunes.


Las excepciones de la tabla 9.1 son lanzadas debido a ciertas operaciones ilegales
relativamente comunes:
Excepcin

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

Marco Besteiro y Miguel Rodrguez

Excepciones

llena por tener demasiadas llamadas a


mtodo pendientes. Situacin que suele
darse en recursiones muy profundas.
System.NullReferenceException
Se lanza cuando se pretende acceder
mediante una referencia null a un
supuesto objeto.
System.TypeInitializationException
Se lanza cuando un constructor static
lanza una excepcin y no existe una
clusula catch que la capture.
System.InvalidCastException
Se lanza cuando falla en tiempo de
ejecucin una conversin de un tipo base
o interface a un tipo derivado.
System.ArrayTypeMismatchException
Se lanza cuando se intenta almacenar un
elemento de un tipo no adecuado en un
array.
System.IndexOutOfRangeException
Se lanza cuando se intenta acceder a un
array mediante un ndice menor que cero
o mayor que el lmite del array.
System.MulticastNotSupportedException Se lanza cuando se intenta combinar dos
delegates no nulos, debido a que el tipo
delegate no tiene como tipo de retorno
void.
System.ArithmeticException
Es la clase base de las excepciones que se
dan durante las operaciones aritmticas,
tales como DivideByZeroException y
OverflowException.
System.DivideByZeroException
Se lanza cuando se intenta dividir un
valor de tipo integral por cero.
System.OverflowException
Se lanza cuando una operacin aritmtica
causa un desbordamiento en un contexto
checked.
Tabla 9.1

4/4

También podría gustarte