pub struct ExceptionHandlers { /* private fields */ }Expand description
Registry for custom exception handlers.
This allows applications to register handlers for specific error types, converting errors into HTTP responses in a customizable way.
§Default Handlers
The registry comes with default handlers for common error types:
HttpError→ JSON response with status/detailValidationErrors→ 422 with error listCancelledError→ 499 Client Closed Request
§Panic Handler
The registry also supports a panic handler that is invoked when a panic
is caught during request handling. This is typically used by the HTTP
server layer via catch_unwind. The default panic handler returns a
500 Internal Server Error.
§Example
use fastapi_core::app::ExceptionHandlers;
use fastapi_core::{RequestContext, Response, HttpError};
#[derive(Debug)]
struct MyCustomError(String);
impl std::fmt::Display for MyCustomError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "Custom error: {}", self.0)
}
}
impl std::error::Error for MyCustomError {}
let handlers = ExceptionHandlers::new()
.handler(|_ctx, err: MyCustomError| {
Response::with_status(StatusCode::BAD_REQUEST)
.body_json(&serde_json::json!({"error": err.0}))
});Implementations§
Source§impl ExceptionHandlers
impl ExceptionHandlers
Sourcepub fn with_defaults() -> Self
pub fn with_defaults() -> Self
Creates a registry with default handlers for common error types.
Sourcepub fn register<E>(
&mut self,
handler: impl Fn(&RequestContext, E) -> Response + Send + Sync + 'static,
)
pub fn register<E>( &mut self, handler: impl Fn(&RequestContext, E) -> Response + Send + Sync + 'static, )
Registers a handler for a specific error type.
The handler receives the error value directly (not boxed) for type safety. If a handler for the same type already exists, it is replaced.
Sourcepub fn handler<E>(
self,
handler: impl Fn(&RequestContext, E) -> Response + Send + Sync + 'static,
) -> Self
pub fn handler<E>( self, handler: impl Fn(&RequestContext, E) -> Response + Send + Sync + 'static, ) -> Self
Registers a handler for a specific error type (builder pattern).
Sourcepub fn handle<E>(&self, ctx: &RequestContext, err: E) -> Option<Response>
pub fn handle<E>(&self, ctx: &RequestContext, err: E) -> Option<Response>
Handles an error by finding and invoking the appropriate handler.
Returns Some(Response) if a handler was found for the error type,
or None if no handler is registered.
Sourcepub fn handle_or_default<E>(&self, ctx: &RequestContext, err: E) -> Response
pub fn handle_or_default<E>(&self, ctx: &RequestContext, err: E) -> Response
Handles an error, falling back to a default 500 response if no handler is found.
Sourcepub fn has_handler<E: 'static>(&self) -> bool
pub fn has_handler<E: 'static>(&self) -> bool
Returns true if a handler is registered for the given error type.
Sourcepub fn merge(&mut self, other: ExceptionHandlers)
pub fn merge(&mut self, other: ExceptionHandlers)
Merges another handler registry into this one.
Handlers from other will override handlers in self for the same error types.
Sourcepub fn panic_handler<F>(self, handler: F) -> Self
pub fn panic_handler<F>(self, handler: F) -> Self
Sets a custom panic handler.
The panic handler is called by the HTTP server layer when a panic is caught
during request handling via catch_unwind. The handler receives the
RequestContext (if available) and a panic message string.
§Example
let handlers = ExceptionHandlers::with_defaults()
.panic_handler(|ctx, panic_msg| {
// Log the panic
eprintln!("Request panicked: {}", panic_msg);
// Return a custom error response
Response::with_status(StatusCode::INTERNAL_SERVER_ERROR)
.body_json(&serde_json::json!({
"error": "internal_server_error",
"message": "An unexpected error occurred"
}))
});Sourcepub fn set_panic_handler<F>(&mut self, handler: F)
pub fn set_panic_handler<F>(&mut self, handler: F)
Sets a custom panic handler (mutable reference version).
Sourcepub fn handle_panic(
&self,
ctx: Option<&RequestContext>,
panic_info: &str,
) -> Response
pub fn handle_panic( &self, ctx: Option<&RequestContext>, panic_info: &str, ) -> Response
Handles a panic by invoking the configured panic handler.
If no panic handler is configured, returns a default 500 Internal Server Error.
This method is intended to be called by the HTTP server layer after catching
a panic via catch_unwind.
§Arguments
ctx- The request context, if available when the panic occurredpanic_info- A string describing the panic (extracted from the panic payload)
Sourcepub fn default_panic_response() -> Response
pub fn default_panic_response() -> Response
Returns the default response for panics: 500 Internal Server Error.
Sourcepub fn has_panic_handler(&self) -> bool
pub fn has_panic_handler(&self) -> bool
Returns true if a custom panic handler is registered.
Sourcepub fn extract_panic_message(payload: &(dyn Any + Send)) -> String
pub fn extract_panic_message(payload: &(dyn Any + Send)) -> String
Extracts a message string from a panic payload.
This is a helper for use with catch_unwind results.