Skip to content

❗ Manejo de Errores en MiniTweet API

MiniTweet cuenta con un sistema robusto de manejo de errores que garantiza que todas las respuestas ante fallos sean claras, estructuradas y útiles tanto para desarrolladores como para usuarios.


🧠 ¿Cómo se gestionan los errores?

La API captura y transforma las excepciones más comunes mediante una clase personalizada GlobalErrorHandler, anotada con @ControllerAdvice, que intercepta automáticamente las excepciones lanzadas por los controladores.

Esto permite centralizar el tratamiento de errores y devolver siempre una estructura de respuesta amigable y consistente.


📦 Estructura de la respuesta de error

Todas las respuestas de error siguen este formato:

{
  "success": false,
  "status": 400,
  "message": "El campo 'email' es obligatorio"
}
  • success: Indica si la operación fue exitosa (siempre false en errores).
  • status: Código HTTP relacionado al error.
  • message: Mensaje claro sobre lo que falló.

📚 Excepciones personalizadas y comunes

Excepción capturada Código HTTP Usada para...
NoResourceFoundException 404 Not Found Cuando un recurso no existe
MethodArgumentNotValidException 400 Bad Request Cuando los datos enviados no son válidos
IllegalArgumentException 400 Bad Request Argumento inválido en una operación
IllegalStateException 400 Bad Request Estado ilegal o no permitido
HttpClientErrorException.Forbidden 403 Forbidden Acceso denegado (sin permisos suficientes)
HttpClientErrorException.Unauthorized 401 Unauthorized Usuario no autenticado
InternalError 500 Internal Server Error Errores internos del servidor
Exception (general) 409 Conflict Cualquier otro tipo de error no previsto

🛠️ Ejemplo de validación de datos

Cuando un campo obligatorio está vacío o con formato incorrecto:

POST /api/auth/register
Content-Type: application/json

{
  "username": "",
  "email": "example@domain.com",
  "password": "123"
}

📉 Respuesta de error esperada

HTTP/1.1 400 Bad Request
POST /api/auth/register
Content-Type: application/json
{
    "message": "Bad Request",
    "data": {
        "username": [
            "Username is required"
        ]
    }
}

Esto es posible gracias a:

@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<GeneralResponse> BadRequestHandler(MethodArgumentNotValidException ex) {
    return GeneralResponse.getResponse(HttpStatus.BAD_REQUEST, errorTools.mapErrors(ex.getBindingResult().getFieldErrors()));
}

🔐 Errores de autorización

Cuando un usuario intenta acceder a un recurso protegido sin el token adecuado:

GET /api/users
Authorization: Bearer <token inválido>

🔐 Respuesta:

HTTP/1.1 401 Unauthorized
{
  "success": false,
  "status": 401,
  "message": "Token inválido o expirado"
}

🧱 Estructura interna del manejo de errores

📌 Clase personalizada: HttpError

@Getter
public class HttpError extends RuntimeException {
    private final HttpStatus httpStatus;

    public HttpError(HttpStatus httpStatus, String message){
        super(message);
        this.httpStatus = httpStatus;
    }
}

Permite lanzar errores personalizados desde cualquier parte del sistema.

🧠 Clase global: GlobalErrorHandler

@ControllerAdvice
public class GlobalErrorHandler {
    ...
    @ExceptionHandler(IllegalArgumentException.class)
    public ResponseEntity<GeneralResponse> IllegalArgumentHandler(IllegalArgumentException ex) {
        return GeneralResponse.getResponse(HttpStatus.BAD_REQUEST, ex.getMessage());
    }
}
//continúa con otros manejadores de excepciones...

Este enfoque evita la repetición de lógica de manejo de errores y mejora la mantenibilidad del sistema.


✅ Buenas prácticas

  • Siempre devuelve errores claros y específicos al cliente.
  • Nunca expongas detalles internos (stacktrace o rutas del servidor).
  • Mantén una estructura uniforme de respuesta ante errores.
  • Usa códigos de estado HTTP correctos y significativos.
  • Implementa excepciones personalizadas para errores comunes.
  • Documenta los posibles errores en la API para que los desarrolladores sepan cómo manejarlos.

¿Listo para probar la API?

Para más detalles sobre cómo autenticarte y manejar errores, revisa la sección de Autenticación y Endpoints.