Skip to main content

Standardize and handle exceptions in FastAPI more elegantly

Project description

Routes Manager for FastAPI

Standardize and handle exceptions in FastAPI more elegantly.

Installation

$ pip install fastapi-exceptionshandler

Example

from fastapi import FastAPI

from fastapi_exceptionshandler import APIExceptionMiddleware

app = FastAPI()

# Register the middleware
app.add_middleware(APIExceptionMiddleware, capture_unhandled=True)  # Capture all exceptions

# You can also capture Validation errors, that are not captured by default
from fastapi_exceptionshandler import APIExceptionHandler

from pydantic import ValidationError
app.add_exception_handler(ValidationError, APIExceptionHandler.unhandled)

from fastapi.exceptions import RequestValidationError
app.add_exception_handler(RequestValidationError, APIExceptionHandler.unhandled)

@app.get("/")
def read_root():
    return 1/0

Run it

$ uvicorn main:app --reload

Check it

Browse to http://127.0.0.1:8000 you should see this json:

{"errorCode": "InternalError", "message": "Internal Server Error"}

Creating custom exceptions

In order to create a custom exception you need to extend APIException and ErrorCodeBase classes.

Note: if you want to capture only APIException then don't send the capture_unhandled param, or set it to False

from fastapi import FastAPI

from fastapi_exceptionshandler import APIExceptionMiddleware, APIException, ErrorCodeBase

from starlette import status


app = FastAPI()

# Register the middleware
app.add_middleware(APIExceptionMiddleware)


class CustomException(APIException):
    status_code = status.HTTP_400_BAD_REQUEST
    
    class ErrorCode(ErrorCodeBase):
        CustomExceptionCode = "Custom Exception Message", status.HTTP_401_UNAUTHORIZED
        CustomExceptionCodeWithDefaultStatusCode = "Custom Exception Message"
        
        
@app.get("/")
def read_root():
    raise CustomException(CustomException.ErrorCode.CustomExceptionCode)

Then you should get a 401 response with this body

{"errorCode": "CustomExceptionCode", "message": "Custom Exception Message"}
Or you can handle exceptions manually...
@app.get("/")
def read_root():
    try:
        raise CustomException(CustomException.ErrorCode.CustomExceptionCode)
    except APIException as exc:
        return await APIExceptionHandler.handled(exc)
    except Exception as exc:  # Handle all exceptions
        return await APIExceptionHandler.unhandled(exc)

Note: The ErrorCode class doesn't need to be inside CustomException and can be shared with another exceptions as well.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fastapi_exceptionshandler-0.1.2.tar.gz (4.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fastapi_exceptionshandler-0.1.2-py3-none-any.whl (5.9 kB view details)

Uploaded Python 3

File details

Details for the file fastapi_exceptionshandler-0.1.2.tar.gz.

File metadata

File hashes

Hashes for fastapi_exceptionshandler-0.1.2.tar.gz
Algorithm Hash digest
SHA256 feff01ca835d6d0f8b60f8a229b083d63ceffee0aa0aa0705ff07b2da6b1ee48
MD5 f16dccbb7f736d90f2c50fc49fd2a4c7
BLAKE2b-256 4dc8a15fb3bcea590594f158d5c9c0c52c4dddc42ff8b2ace0df0d8589b314ba

See more details on using hashes here.

File details

Details for the file fastapi_exceptionshandler-0.1.2-py3-none-any.whl.

File metadata

File hashes

Hashes for fastapi_exceptionshandler-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 a593c8665826d6e93e03e1130e31d2708952664a044d961b83ec8372998b025e
MD5 9ea2d972b9438b14402163e06646239e
BLAKE2b-256 60989b625af88f8be076bf70b0eb1551f4700ca6cdf7210020317a6bea5bbbe7

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page