C# proporciona soporte integrado para el manejo de excepciones o de una forma más formal situaciones anómalas de funcionamiento, las cuales pueden ocurrir en cualquier momento durante la ejecución del programa y son manejadas por el código que se encuentra fuera del flujo normal de control. Todo esto gracias a las palabras clave try, throw, catch y finally. C# proporciona una solución estructurada tanto a nivel del sistema como de aplicación 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 aplicación. Manejo de Excepciones. Las excepciones se manejan mediante una sentencia try-catch-finally.
Por ejemplo:
Marco Besteiro y Miguel Rodríguez Excepciones 2/4 try { string s = null; x.MiFun(s); }
catch (ArgumentNullException e) { Console.WriteLine("{0} Primera excepción capturada", e); }
catch (Exception e) { Console.WriteLine("{0} Segunda excepción capturada", e); }
Cuando se lanza una excepción desde el código que está entre las llaves de la cláusula try, el sistema busca la primera cláusula catch que pueda manejar el tipo de excepción que se ha lanzado (el tipo de excepción ha de coincidir con el del parámetro que espera la cláusula catch o bien ser de un tipo derivado al que espera la cláusula catch).
Si no se encuentra la cláusula catch adecuada se sigue buscando la excepción en el punto del código desde el que se ha llamado al método que contiene la cláusula try donde se ha lanzado la excepción. Esta operación se repite hasta encontrar una cláusula catch que maneje (también se dice “capture”) la excepción.
Es importante tener en cuenta que si se desea que una cláusula catch capture cualquier excepción ha de definirse sin parámetros.
Una vez se ha encontrado la cláusula catch que maneja la excepción, se transfiere el control a la primera sentencia de tal cláusula. Antes de ejecutar la primera sentencia de la cláusula catch, se ejecutan todas las cláusulas finally de las sentencias try anidadas a la que captura la excepción.
Si no se encuentra una cláusula catch puede ocurrir una de las dos opciones siguientes: - Si la búsqueda llega a un constructor static o a un inicializador de campos static, se lanza una excepción System.TypeInicializationException en el punto en el que se invocó al constructor. El campo InnerException de la excepción TypeInicializationException contiene la excepción originalmente lanzada. - Si la búsqueda llega al código que inicialmente comenzó el thread o el proceso, la ejecución del thread o el proceso finaliza. 1. Manejo en lenguajes que no conteníanimplícito el manejo de excepciones 2. Manejo en lenguajes que sí lo contienen ypermiten tener: Excepciones predefinidas por el lenguaje (Implícitas) Excepciones definidas por el programador
(Explícitas) using System; public class ManejoExcepciones {
public static void Main() { try //Le hacemos saber que puede ocurrir un error { string s=null; //Declaramos un string y lo dejamos vacio if (s == null) //Si el string esta vacio throw(new ExcepcionCadenaVacia()); //Lanzamos un error personalizado Console.WriteLine("Esto nunca se imprime"); //Si ahi error el código sale de la ejecución normal //es por eso que esta parte nunca se ejecuta } catch( ExcepcionCadenaVacia e ) //Atrapamos nuestro error { Console.WriteLine("La cadena esta vacia"); //Manejamos el error } finally { Console.WriteLine("Esto siempre se imprime"); //Esto siempre se ejecutará } } }