Saltar a contenido

Manejo de errores 🚦

Hay muchas situaciones en las que necesitas notificar un error al cliente que está utilizando tu API. Podrías necesitar decirle al cliente que:

  • El cliente no tiene suficientes privilegios para esa operación.
  • El cliente no tiene acceso a ese recurso.
  • El recurso al que el cliente estaba intentando acceder, no existe.

etc..., En estos casos, normalmente devolverías un código de estado HTTP en el rango de 400 (de 400 a 499).

Callisto proporciona algunas funciones para manejar estas excepciones.

Importante

Se recomienda cargar(registrar) estos manejadores de error, utilizando exception_handler de FastApi.

Defina estas funciones después de la instancia principal del BackEnd y de los middlewares.

El uso de estas funciones se encuentra en el archivo app/server.py.

veamos un ejemplo:

# app/server.py

from .error_handlers import not_found
...

fastapp = FastAPI(
    title="Callisto",
    description="Callisto BackEnd",
)

...

# register middlewares
fastapp.add_middleware(GZipMiddleware, minimum_size=100, compresslevel=6)

# register exception handlers
fastapp.add_exception_handler(404, not_found)

Nota

Para más información consulta el módulo error_handlers.

not_found

Se encarga de devolver una respuesta JSON por defecto, cuando no se encuentra el recurso solicitado.

1
2
3
4
from .error_handlers import not_found
...

fastapp.add_exception_handler(404, not_found)

not_allowed

Se encarga de devolver una respuesta JSON por defecto, cuando el recurso solicitado no está permitido, normalmente generado por APIRouter.

1
2
3
4
from .error_handlers import not_allowed
...

fastapp.add_exception_handler(405, not_allowed)

request_entity_too_large

Para GAE/Google Cloud Run, cuando la solicitud es más grande de lo que el servidor quiere o puede servir.

1
2
3
4
from .error_handlers import request_entity_too_large
...

fastapp.add_exception_handler(413, request_entity_too_large)

infernal_server_error

Se encarga de devolver las respuestas en JSON por defecto, cuando se lanza una HTTPException, para prevenir que el BackEnd genere un error 500x.

1
2
3
4
from .error_handlers import infernal_server_error
...

fastapp.add_exception_handler(500, infernal_server_error)

validation_exception_handler

Sobreescribe algunos errores de FastApi (Ej. 422) por mensajes acordes a la estructura de respuestas del BackEnd.

1
2
3
4
5
from fastapi.exceptions import RequestValidationError
from .error_handlers import validation_exception_handler
...

fastapp.add_exception_handler(RequestValidationError, validation_exception_handler)

custom_http_exceptions

Sobreescribe algunos errores de FastApi generados por excepciones personalizadas y por HTTPException, con mensajes acordes a la estructura de respuestas del BackEnd.

1
2
3
4
5
from fastapi.exceptions import HTTPException
from .error_handlers import custom_http_exceptions
...

fastapp.add_exception_handler(HTTPException, custom_http_exceptions)

Lectura recomendada