Implement centralized exception handling and validation
- Add custom exception classes for structured error handling - Implement global exception handlers in FastAPI application - Add comprehensive request/response validation - Create exception contract tests for validation - Update backend development documentation Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -30,32 +30,13 @@ from starlette.middleware.base import BaseHTTPMiddleware
|
||||
from app import __version__
|
||||
from app.config import Settings, get_settings
|
||||
from app.exceptions import (
|
||||
ActionAlreadyExistsError,
|
||||
ActionNameError,
|
||||
ActionNotFoundError,
|
||||
ActionReadonlyError,
|
||||
ConfigDirError,
|
||||
ConfigFileExistsError,
|
||||
ConfigFileNameError,
|
||||
ConfigFileNotFoundError,
|
||||
ConfigFileWriteError,
|
||||
ConfigOperationError,
|
||||
ConfigValidationError,
|
||||
ConfigWriteError,
|
||||
BadRequestError,
|
||||
ConflictError,
|
||||
Fail2BanConnectionError,
|
||||
Fail2BanProtocolError,
|
||||
FilterAlreadyExistsError,
|
||||
FilterInvalidRegexError,
|
||||
FilterNameError,
|
||||
FilterNotFoundError,
|
||||
FilterReadonlyError,
|
||||
JailAlreadyActiveError,
|
||||
JailAlreadyInactiveError,
|
||||
JailNameError,
|
||||
JailNotFoundError,
|
||||
JailNotFoundInConfigError,
|
||||
JailOperationError,
|
||||
ServerOperationError,
|
||||
NotFoundError,
|
||||
OperationError,
|
||||
ServiceUnavailableError,
|
||||
)
|
||||
from app.middleware.csrf import CsrfMiddleware
|
||||
from app.routers import (
|
||||
@@ -528,31 +509,12 @@ def create_app(settings: Settings | None = None) -> FastAPI:
|
||||
# rather than falling through to the generic 500 handler.
|
||||
app.add_exception_handler(Fail2BanConnectionError, _fail2ban_connection_handler) # type: ignore[arg-type]
|
||||
app.add_exception_handler(Fail2BanProtocolError, _fail2ban_protocol_handler) # type: ignore[arg-type]
|
||||
app.add_exception_handler(JailNotFoundError, _not_found_handler) # type: ignore[arg-type]
|
||||
app.add_exception_handler(JailNotFoundInConfigError, _not_found_handler) # type: ignore[arg-type]
|
||||
app.add_exception_handler(FilterNotFoundError, _not_found_handler) # type: ignore[arg-type]
|
||||
app.add_exception_handler(ActionNotFoundError, _not_found_handler) # type: ignore[arg-type]
|
||||
app.add_exception_handler(ConfigFileNotFoundError, _not_found_handler) # type: ignore[arg-type]
|
||||
app.add_exception_handler(ConfigValidationError, _bad_request_handler) # type: ignore[arg-type]
|
||||
app.add_exception_handler(ConfigFileNameError, _bad_request_handler) # type: ignore[arg-type]
|
||||
app.add_exception_handler(ConfigOperationError, _bad_request_handler) # type: ignore[arg-type]
|
||||
app.add_exception_handler(ServerOperationError, _bad_request_handler) # type: ignore[arg-type]
|
||||
app.add_exception_handler(ActionNameError, _bad_request_handler) # type: ignore[arg-type]
|
||||
app.add_exception_handler(FilterNameError, _bad_request_handler) # type: ignore[arg-type]
|
||||
app.add_exception_handler(JailNameError, _bad_request_handler) # type: ignore[arg-type]
|
||||
app.add_exception_handler(FilterInvalidRegexError, _bad_request_handler) # type: ignore[arg-type]
|
||||
app.add_exception_handler(NotFoundError, _not_found_handler)
|
||||
app.add_exception_handler(BadRequestError, _bad_request_handler)
|
||||
app.add_exception_handler(ConflictError, _conflict_handler)
|
||||
app.add_exception_handler(OperationError, _domain_error_handler)
|
||||
app.add_exception_handler(ServiceUnavailableError, _service_unavailable_handler)
|
||||
app.add_exception_handler(ValueError, _value_error_handler) # type: ignore[arg-type]
|
||||
app.add_exception_handler(JailOperationError, _conflict_handler) # type: ignore[arg-type]
|
||||
app.add_exception_handler(JailAlreadyActiveError, _conflict_handler) # type: ignore[arg-type]
|
||||
app.add_exception_handler(JailAlreadyInactiveError, _conflict_handler) # type: ignore[arg-type]
|
||||
app.add_exception_handler(FilterAlreadyExistsError, _conflict_handler) # type: ignore[arg-type]
|
||||
app.add_exception_handler(ActionAlreadyExistsError, _conflict_handler) # type: ignore[arg-type]
|
||||
app.add_exception_handler(FilterReadonlyError, _conflict_handler) # type: ignore[arg-type]
|
||||
app.add_exception_handler(ActionReadonlyError, _conflict_handler) # type: ignore[arg-type]
|
||||
app.add_exception_handler(ConfigFileExistsError, _conflict_handler) # type: ignore[arg-type]
|
||||
app.add_exception_handler(ConfigWriteError, _domain_error_handler) # type: ignore[arg-type]
|
||||
app.add_exception_handler(ConfigDirError, _service_unavailable_handler) # type: ignore[arg-type]
|
||||
app.add_exception_handler(ConfigFileWriteError, _bad_request_handler) # type: ignore[arg-type]
|
||||
app.add_exception_handler(Exception, _unhandled_exception_handler)
|
||||
|
||||
# --- Routers ---
|
||||
|
||||
Reference in New Issue
Block a user