csharp-bloque-try-catch

El Bloque Try-Catch en C#

El bloque try-catch en C# se utiliza para capturar y manejar excepciones (errores) que pueden ocurrir durante la ejecución de un programa.

Una excepción es un evento inesperado que interrumpe el flujo normal del programa. El objetivo del bloque try-catch es permitir que el programa responda a estos eventos de manera controlada, en lugar de finalizar abruptamente.

Estructura Básica

La estructura básica del bloque try-catch es la siguiente:

try
{
    // Código que puede lanzar una excepción
}
catch (Exception tipoExcepcion)
{
    // Código para manejar la excepción
}

En esta estructura,

  • El bloque try contiene el código que se desea monitorear para posibles excepciones
  • El bloque catch contiene el código que se ejecutará si ocurre una excepción.

Ejemplo básico

Consideremos un ejemplo donde intentamos dividir dos números y manejar una posible división por cero:

try
{
    int divisor = 0;
    int resultado = 10 / divisor;
}
catch (DivideByZeroException ex)
{
    Console.WriteLine("Error: División por cero no permitida.");
    Console.WriteLine($"Detalles: {ex.Message}");
}

En este ejemplo, el bloque try intenta dividir 10 entre 0, lo que provoca una excepción DivideByZeroException. El bloque catch captura esta excepción y proporciona un mensaje de error informativo.

Captura de múltiples excepciones

Puedes tener múltiples bloques catch para manejar diferentes tipos de excepciones de manera específica:

try
{
    // Código que puede lanzar excepciones
}
catch (DivideByZeroException ex)
{
    Console.WriteLine("Error: División por cero.");
}
catch (NullReferenceException ex)
{
    Console.WriteLine("Error: Referencia nula.");
}
catch (Exception ex)
{
    Console.WriteLine("Error: Se produjo un error general.");
}

En este ejemplo, se manejan DivideByZeroException, NullReferenceException y una excepción genérica Exception que captura cualquier otro tipo de excepción no específicamente manejada.

Uso del Bloque finally

El bloque finally se puede utilizar para ejecutar código que debe ejecutarse independientemente de si se produjo una excepción o no. Es útil para liberar recursos, cerrar archivos, o realizar otras tareas de limpieza.

try
{
    // Código que puede lanzar una excepción
}
catch (Exception ex)
{
    Console.WriteLine($"Error: {ex.Message}");
}
finally
{
    Console.WriteLine("Este bloque siempre se ejecuta.");
}

En este ejemplo, el bloque finally siempre se ejecutará, ya sea que se haya producido una excepción o no.

Ejemplos prácticos

Manejo de excepciones en operaciones de I/O

En este ejemplo, se utiliza un bloque try-catch para manejar excepciones que pueden ocurrir durante la lectura de un archivo. Los bloques catch manejan dos tipos de excepciones: FileNotFoundException si el archivo no existe, y IOException para otros problemas relacionados con la entrada/salida.

try
{
    // Abrimos el archivo 'archivo.txt' para lectura utilizando StreamReader.
    using (StreamReader reader = new StreamReader("archivo.txt"))
    {
        // Leemos todo el contenido del archivo.
        string contenido = reader.ReadToEnd();
        // Mostramos el contenido en la consola.
        Console.WriteLine(contenido);
    } // El bloque 'using' asegura que el StreamReader se cierre y libere correctamente.
}
catch (FileNotFoundException ex)
{
    // Captura y maneja la excepción si el archivo no se encuentra.
    Console.WriteLine("Error: El archivo no se encontró.");
}
catch (IOException ex)
{
    // Captura y maneja otros errores de I/O, como problemas de lectura.
    Console.WriteLine("Error de I/O: Problema al leer el archivo.");
}