Profesor: Pablo Ulman (Polshu) Manejo de Excepciones (Try / Catch / Finally) . Manejo de Excepciones: Las características de control de excepciones del lenguaje C# proporcionan una manera de afrontar cualquier situación inesperada o excepcional que se presente mientras se ejecuta un programa. El control de excepciones utiliza las palabras clave try, catch y finally para intentar realizar acciones que podrían plantear problemas, controlar errores cuando considere que sea razonable y limpiar los recursos después. Pueden generar excepciones el Common Language Runtime (CLR), .NET Framework, las bibliotecas de otros fabricantes o el código de aplicación. Las excepciones se crean mediante la palabra clave throw. En muchos casos, puede que una excepción no la produzca un método que el código ha llamado directamente, sino otro método que aparece más adelante en la pila de llamadas. Cuando esto sucede, CLR desenredará la pila a fin de buscar un método con un bloque catch para el tipo de excepción específico y ejecutará el primer bloque catch de este tipo que encuentre. Si no encuentra ningún bloque catch adecuado en la pila de llamadas, finalizará el proceso y mostrará un mensaje al usuario. Las excepciones tienen las siguientes propiedades: Cuando la aplicación encuentra una circunstancia excepcional, como una división por cero o una advertencia de que no hay suficiente memoria, se genera una excepción. Utilice un bloque try alrededor de las instrucciones que puedan generar excepciones. Cuando se produce una excepción dentro del bloque try, el flujo de control salta inmediatamente a un controlador de excepciones asociado, si existe alguno. Si no hay un controlador de excepciones para una excepción determinada, el programa deja de ejecutarse y presenta un mensaje de error. Si un bloque catch define una variable de excepción, puede utilizar dicho bloque para obtener más información sobre el tipo de excepción que se ha producido. Las acciones que pueden producir una excepción se ejecutan con la palabra clave try. Un controlador de excepciones es un bloque de código que se ejecuta cuando se produce una excepción. En C#, la palabra clave catch se utiliza para definir un controlador de excepciones. Un programa que utiliza la palabra clave throw puede generar explícitamente excepciones. Los objetos de excepción contienen información detallada sobre el error que incluye el estado de la pila de llamadas y una descripción de texto del error. El código se ejecuta en un bloque finally aunque se produzca una excepción, permitiendo así que el programa libere recursos. try{ // Bloque de código que puede producir la excepción. }catch(Exception ex){ // Bloque en el cual se controlan las excepciones // que ocurren en un bloque try. }finally{ // Bloque que se ejecuta independientemente de cómo finaliza el bloque try. } El bloque try-catch consiste en un bloque try seguido de una o varias cláusulas catch, las cuales especifican los manejadores de las diferentes excepciones. La cláusula catch puede ser utilizada sin ningún argumento, esto hará que lo errores sean atrapados pero nunca podríamos saber el motivo que generó de la excepción. Por otro lado podemos obtener en el bloque catch un objeto deriva de la clase System.Exception, que será la encargada de recibir los datos de la excepción. Por ejemplo: string strNumero = "diez"; try { int intNumero = Convert.ToInt32(strNumero); } catch (Exception ex){ // Bloque catch. } // Genero una excepcion La variable ex contiene información acerca de la excepción que ha ocurrido y mediante la propiedad Message podríamos obtener la misma. v 2.0 rev 1.0 1 de 2 Profesor: Pablo Ulman (Polshu) Manejo de Excepciones (Try / Catch / Finally) . Algunos consejos El código metido entre try, catch se ejecuta muy lento y consume muchos recursos. Así que sólo manejemos excepciones cuando realmente se necesite. Cuándo es eso? Las excepciones están construidas para manejar condiciones que no se pueden controlar con la lógica de la aplicación. Por ejemplo que se corta la conexión con el servidor, que el disco está lleno, o que el hardware falló, etc. Antes de lanzar excepciones por todo, fijémonos si realmente es necesario. Evitemos también poner mucho código en el try; solo afectemos con el try el código que realmente puede fallar. Por ejemplo: Correcto if (conn.State != ConnectionState.Closed){ conn.Close(); } a: Erróneo try { conn.Close(); } catch (Exception ex) { // Bloque catch } No emita Exception(), pues el framework .net tiene un número de excepciones que nos permite controlar argumentos y operaciones inválidas, timeouts, conexiones, overflows, etc. Se debe utilizar esas excepciones que realmente nos indican qué fue lo que sucedió. Use bloques try/finally. Recuerde que las instrucciones en el Finally siempre se ejecutan independientemente de si se produjo o no la excepción. Esto es muy útil para liberar recursos, cerrar conexiones, etc. v 2.0 rev 1.0 2 de 2