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


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); }

Excepciones

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


x.MiFun(s); }

Excepciones

// 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
System.OutOfMemoryException

System.StackOverflowException

Causa Se lanza cuando falla un intento de reservar memoria mediante el operador new. Se lanza cuando la pila de ejecucin se

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