Transport-agnostic, typed error DTOs and envelopes for APIs
Project description
apierrors
Transport-agnostic, typed error DTOs and envelopes for APIs. Use the same domain error objects across HTTP, gRPC, GraphQL, WebSocket, JSON-RPC, and message queues—with first-class support for HTTP out of the box and a 422 format compatible with FastAPI.
Why
Framework built-ins (e.g., HTTPException) are convenient but hard-wire
errors to one transport. apierrors keeps your domain errors independent
and adds thin adapters per transport. Your handlers build rich, typed errors;
adapters serialize them for the wire.
Features
- Typed DTOs:
Err400/401/403/404/405/409/422/...with critical fields (e.g.,locfor 422,allowed_methodsfor 405,permissionfor 403). - Transport-agnostic core: domain errors don’t depend on HTTP.
- HTTP envelopes:
HttpErrorEnvelope[T]withstatus_code, optionalheaders. - FastAPI-style 422:
Err422supportsloc,error_type(aka type),ctx,message(aka msg). - Consistent JSON: stable shape for clients & SDKs.
- Headers helpers: easy
WWW-Authenticate,Allow, Retry-After. - Adapters (extensible): examples for gRPC, GraphQL, WS.
Install
pip install apierrors
Python 3.11+.
Why not just HTTPException (FastAPI / Starlette)?
| Aspect | HTTPException |
apierrors |
|---|---|---|
| Transport | HTTP-only | Transport-agnostic domain errors + HTTP adapter |
| Typing/DTOs | Message + status | Rich typed DTOs per status (401, 403, 405, 409, 422…) |
| 422 details | Framework-controlled | Explicit loc/error_type/ctx, same across transports |
| Headers | Manual, ad-hoc | DTO fields + helper factories (e.g., Allow, WWW-Authenticate) |
| Reuse in gRPC/GraphQL/WS | No | Yes, via adapters |
| Client SDKs | Ad-hoc parsing | Stable JSON shapes for codegen/SDKs |
| Testability | Inspect exception | Assert on DTO fields & envelopes |
Bottom line: keep domain errors independent; adapt once per transport.
Comparison to other libs
- Starlette / FastAPI exceptions: great for quick HTTP flows but hard-wire
transport and shape; 422 format depends on framework internals.
apierrorsgives you the same clarity for 422 while remaining cross-transport. - DRF APIException / Marshmallow errors: framework-centric, tightly coupled
to serializers/validators.
apierrorscan ingest their outputs and produce a consistent cross-transport error shape. - Werkzeug/HTTPX exceptions: HTTP-only and less prescriptive about rich detail.
Best practices
- Build domain errors, not responses. Keep HTTP concerns at the edge.
- Use specific DTOs. Prefer
Err403(resource=..., action=..., permission=...)over a generic message. - 422 consistently. Use loc paths identical to your validator (
("body","items",0,"price")). - Set headers via envelope. Mirror DTO fields into
headers(e.g.,Allow). - Log
request_id. Populate for traceability; shiptimestampautomatically.
Roadmap
- More transports & adapters
- gRPC error details (
google.rpc.BadRequest/ErrorInfo) - GraphQL
extensions& Apollo format - JSON-RPC 2.0 (
code/message/data) - WebSocket/SSE payloads & close codes
- Message buses (Kafka/RabbitMQ) error envelopes
- gRPC error details (
- RFC7807 adapter (Problem Details) with per-status extensions
- Pydantic & Marshmallow bridges (auto-convert validation errors →
Err422) - i18n: message translation hooks
- Retry semantics: helpers for
Retry-After, backoff hints - Codegen: JSON Schema for errors to power SDKs
- 5xx suite:
Err500..Err504with incident/trace fields
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file apierrors-0.0.7.tar.gz.
File metadata
- Download URL: apierrors-0.0.7.tar.gz
- Upload date:
- Size: 13.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dfb6a81adb948e1a9da2b0ca5243e3de1309537d00858c52d4bb4a41c3dc37a5
|
|
| MD5 |
b807fb75dee2e9c57ee74e1f2aba3b65
|
|
| BLAKE2b-256 |
26ebd037b20725c910eb407cc7474cfa3cfa44fa19239c41d142c36af3ffb86c
|
File details
Details for the file apierrors-0.0.7-py3-none-any.whl.
File metadata
- Download URL: apierrors-0.0.7-py3-none-any.whl
- Upload date:
- Size: 16.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8b8984d1c2cfe64b84dde36c1c8b6119f441940ffd878e715edd65f39d5d4dc1
|
|
| MD5 |
574a79f9ed6f62e0412efb27e861a12c
|
|
| BLAKE2b-256 |
7591078a19437c601116c33c60f71acc1fdc8e3084ab1d7dadfa72813beb96e2
|