Saltar al contenido

Excepciones en C#. Try – Catch.

Cuando hablamos de excepciones en C# o en cualquier lenguaje de programación, nos referimos al tipo de error que se está dando en nuestra aplicación. Podemos diferencia dos tipos de errores, de ejecución o de compilación.

Los primeros se refieren a que el software esta dando errores cuando el programa se está ejecutando. El segundo se refiere a errores a la hora de compilar el programa. Esto quiere decir que el error se produce a la hora de transformar el código fuente en código máquina.

Para controlar los errores que puedan surgir y saber la excepción ocurre en el programa se utiliza lo que llamamos estructura de control de errores.

Control de excepciones en C# a través de un try catch.

Para controlar los errores y saber las excepciones que están ocurriendo, lo haremos siempre con un bloque try – catch. Esta estructura se compone de dos bloques de código.

Por un lado, el bloque del Try en el que intentaremos ejecutar una serie de instrucciones. Una vez ejecutadas todas las instrucciones, el programa saldrá de esta estructura y continuará ejecutando el resto del código.

En caso de que encuentre cualquier tipo de error saltará del primer bloque (try) y ejecutará el segundo bloque (catch). Este segundo bloque capturará cualquier tipo de error que pueda existir y mostrará un mensaje que puede ser el que nosotros definamos para que el programa no deje de funcionar en ningún momento.

Si queremos mostrar el mensaje por defecto, nos mostrará la excepción correspondiente. Vamos a ver un ejemplo de construcción de esta estructura.

Este control de errores, no solo se realiza en C#, sino que lo podemos realizar en otros lenguajes de programación. Por ejemplo, php, java, o VB.Net entre otros.

Ejemplo de control de errores en C#.

using System;

namespace Excepciones
{
    class Program
    {
        static void Main(string[] args)
        {
            /* Declaro una variable que almacena
             * un número entero para este ejemplo.*/
            int num = 0; 
            
            try // Intentamos ejecutar el programa...
            {
                /* Aquí iran las instrucciones del programa que
                 * se quieran ejecutar, por ejemplo:
                 * Pedimos un número*/
                Console.WriteLine("Escribe un número: ");

                /* Lo leemos. Recordamos que debemos hacer
                 * la conversión del tipo de dato.*/
                num = int.Parse(Console.ReadLine());

                /* En la variable num se tiene que almacenar un
                 * número entero. Si no se puede pasar a número
                 * el valor que introduce el usuario, si por ejemplo
                 * introduce una A, habrá un error en el programa.
                 * En ese caso saltará al bloque catch.*/
            }

            catch (Exception Msg)
            {
                /* Este bloque lo ejecutará solo si existe algun error.
                 * En este bloque solo mostraremos un mensaje.
                 * Podemos mostrar un mensaje personalizado de esta forma*/
                Console.WriteLine("Dato no válido.");

                /* O podemos mostrar la excepción que nos de el programa
                 * mostrando el valor de la la variable*/
                Console.WriteLine(Msg);

                // o podemos concatenar los dos mensajes
                Console.WriteLine("Dato no válido" + Msg);
            }
            // Si no hay errores, ejecutará el bloque try y saltará aqui:
            Console.ReadKey();
        }
    }
}

Este es el bloque tradicional try catch pero además podemos encontrarnos también con un bloque adicional y opcional después del catch. Este bloque es el bloque finally y se va a ejecutar independientemente de que el programa tenga o no errores. Es decir es un bloque que siempre se ejecutará y se formará de la siguiente manera:

finally
            {
                // Tanto si hay errores como si no, ejecutará
                // las instrucciones de este bloque. Ejecutará el try
                // y luego el finally, o bien el catch y luego el finally
                // pero entrará a ejecutar las instrucciones de este bloque
                // siempre que exista.
                Console.ReadKey();
            }

De esta forma el bloque completo con los bloques opcionales quedaría de la siguiente manera:

using System;

namespace Excepciones
{
    class Program
    {
        static void Main(string[] args)
        {
            /* Declaro una variable que almacena
             * un número entero para este ejemplo.*/
            int num = 0; 
            
            try // Intentamos ejecutar el programa...
            {
                /* Aquí iran las instrucciones del programa que
                 * se quieran ejecutar, por ejemplo:
                 * Pedimos un número*/
                Console.WriteLine("Escribe un número: ");

                /* Lo leemos. Recordamos que debemos hacer
                 * la conversión del tipo de dato.*/
                num = int.Parse(Console.ReadLine());

                /* En la variable num se tiene que almacenar un
                 * número entero. Si no se puede pasar a número
                 * el valor que introduce el usuario, si por ejemplo
                 * introduce una A, habrá un error en el programa.
                 * En ese caso saltará al bloque catch.*/
            }

            catch (Exception Msg)
            {
                /* Este bloque lo ejecutará solo si existe algun error.
                 * En este bloque solo mostraremos un mensaje.
                 * Podemos mostrar un mensaje personalizado de esta forma*/
                Console.WriteLine("Dato no válido.");

                /* O podemos mostrar la excepción que nos de el programa
                 * mostrando el valor de la la variable*/
                Console.WriteLine(Msg);

                // o podemos concatenar los dos mensajes
                Console.WriteLine("Dato no válido" + Msg);
            }
            finally
            {
                /* Independientemente de ejecutar el try, una vez se ejecuten
                 * uno de los dos bloques, saltará a este bloque finally
                 * donde ejecutará lo siguiente*/
                Console.ReadKey();
            }
        }
    }
}