Manejo de errores en C#: try/catch y más de la A a la Z

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Manejo de errores en C#: try/catch y más: de la A a la Z



Cualquier aplicación, incluso escrita por el desarrollador más experimentado, puede enfrentarse a situaciones imprevistas: fallo de red, archivo inexistente en el disco, división por cero o entrada de datos incorrecta. En C# (.NET), para gestionar estas situaciones se utiliza el mecanismo de excepciones (exceptions). En este artículo, analizaremos todo lo que necesitas saber sobre el manejo de errores: desde la construcción básica try/catch hasta la creación de tipos de excepción propios y las mejores prácticas modernas.



1. Fundamentos: la construcción try/catch/finally



En C#, el manejo de errores se basa en tres bloques clave: try, catch y finally.



  • try — contiene el código que podría lanzar una excepción.
  • catch — captura y maneja una excepción específica.
  • finally — se ejecuta siempre, independientemente de si hubo una excepción o no (generalmente para liberar recursos).


try{    int[] numbers = { 1, 2, 3 };    Console.WriteLine(numbers[5]); // IndexOutOfRangeException}catch (IndexOutOfRangeException ex){    Console.WriteLine($"Error: {ex.Message}");}finally{    Console.WriteLine("El bloque finally siempre se ejecuta.");}


Puedes usar múltiples bloques catch para diferentes tipos de excepciones. El manejo se realiza de arriba hacia abajo, por lo que las excepciones más específicas deben colocarse antes que las generales.



try{    // código peligroso}catch (DivideByZeroException ex){    Console.WriteLine("¡División por cero!");}catch (Exception ex) // captura general{    Console.WriteLine($"Ocurrió un error: {ex.Message}");}


2. Generación de excepciones: el operador throw



A veces necesitas informar explícitamente sobre una situación incorrecta. Para ello se utiliza el operador throw. Puedes lanzar tanto una excepción estándar como una propia.



public void ValidateAge(int age){    if (age < 0 || age > 150)    {        throw new ArgumentOutOfRangeException(nameof(age), "La edad debe estar entre 0 y 150.");    }    Console.WriteLine("Edad correcta.");}


También existe la construcción throw; (sin argumentos) — se usa dentro de un bloque catch para relanzar la misma excepción. Esto es útil cuando quieres registrar el error en un log, pero no quieres suprimir la excepción.



try{    // código}catch (Exception ex){    Log.Error(ex); // registro en log    throw;         // relanzamiento — la excepción continúa propagándose}


3. Creación de excepciones propias (Custom Exceptions)



Para la lógica de negocio, a menudo es más conveniente usar tus propios tipos de excepción. Esto hace que el código sea más legible y permite manejar errores específicos con precisión.



Reglas para crear una excepción personalizada:

  • Heredar de la clase Exception (o de ApplicationException, pero es mejor heredar de Exception).
  • Implementar los tres constructores estándar (sin parámetros, con mensaje, con mensaje y excepción interna).
  • Se recomienda agregar el sufijo Exception al nombre de la clase.


public class UserNotFoundException : Exception{    public UserNotFoundException() { }

public UserNotFoundException(string message) : base(message) { }

public UserNotFoundException(string message, Exception inner) : base(message, inner) { }}

// Usothrow new UserNotFoundException("Usuario con ID 123 no encontrado.");


4. Mejores prácticas: cómo no perjudicarte a ti mismo ni al proyecto



El manejo de errores no es simplemente envolver todo en un try/catch. Aquí hay algunas reglas de oro que vale la pena seguir en C# (.NET):

\

Blogs

Book Recommendations