docsExcepciones

Manejo de Excepciones

El proyecto implementa un sistema centralizado de manejo de excepciones usando @ControllerAdvice. Este enfoque permite una gestión consistente de errores en toda la aplicación.

Estructura de Respuesta de Error

Todas las excepciones se transforman en un formato estandarizado:

{
  "message": "Mensaje principal del error",
  "errors": [
    "Detalle del error 1",
    "Detalle del error 2"
  ]
}

Excepciones Personalizadas

NotFoundException

Usada cuando un recurso no se encuentra en el sistema.

// Ejemplo de uso
throw new NotFoundException("Usuario con ID 123 no encontrado");
 
// Respuesta (HTTP 404)
{
  "message": "Recurso no encontrado",
  "errors": ["Usuario con ID 123 no encontrado"]
}

InvalidTokenException

Lanzada cuando hay problemas con tokens JWT.

// Ejemplo de uso
throw new InvalidTokenException("Token expirado");
 
// Respuesta (HTTP 400)
{
  "message": "Validación del token incorrecta",
  "errors": ["Token expirado"]
}

Validación de Entrada

Las validaciones de DTO usando anotaciones como @Valid son manejadas automáticamente:

// Ejemplo de DTO con validaciones
public class UserDTO {
    @NotBlank(message = "El email es requerido")
    @Email(message = "Email inválido")
    private String email;
    
    @Size(min = 8, message = "La contraseña debe tener al menos 8 caracteres")
    private String password;
}
 
// Si la validación falla, la respuesta será (HTTP 400):
{
  "message": "Validación de la petición incorrecta",
  "errors": [
    "El email es requerido",
    "La contraseña debe tener al menos 8 caracteres"
  ]
}

Personalización de Excepciones

Para añadir nuevas excepciones personalizadas:

  1. Crea tu excepción personalizada:
public class MiExcepcionPersonalizada extends RuntimeException {
    public MiExcepcionPersonalizada(String message) {
        super(message);
    }
}
  1. Añade el manejador en GlobalExceptionHandler:
@ExceptionHandler(MiExcepcionPersonalizada.class)
public ResponseEntity<ErrorResponse> handleMiExcepcion(
    final MiExcepcionPersonalizada ex
) {
    return ResponseEntity
        .status(HttpStatus.BAD_REQUEST)
        .body(new ErrorResponse(
            "Título del error",
            List.of(ex.getMessage())
        ));
}

Jerarquía de Excepciones

  1. Excepciones Específicas: Manejadas primero

    • NotFoundException
    • InvalidTokenException
    • MethodArgumentNotValidException
  2. Excepciones Generales: Capturan errores no manejados

    • Exception
    • Throwable

Mejores Prácticas

  1. Mensajes de Error:

    • Sé específico pero no reveles detalles internos
    • Incluye IDs o referencias útiles para debugging
    • Mantén un formato consistente
  2. Códigos HTTP:

    • 400: Errores de validación/cliente
    • 401: No autenticado
    • 403: No autorizado
    • 404: Recurso no encontrado
    • 500: Errores internos
  3. Logging:

    • Log errores inesperados para debugging
    • No loguees información sensible
    • Incluye IDs de correlación
  4. Seguridad:

    • No devuelvas stacktraces al cliente
    • Sanitiza mensajes de error
    • Maneja timeouts apropiadamente