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