Fänger
Wenn der Statuscode einer Response
einen Fehler anzeigt und der Body
der Seite leer ist, versucht Salvo, diesen Fehler mit einem Catcher
abzufangen und eine benutzerfreundliche Fehlerseite anzuzeigen.
Mit Catcher::default()
können Sie einen standardmäßigen Catcher
des Systems erhalten und ihn dann zum Service
hinzufügen.
use salvo::catcher::Catcher;
Service::new(router).catcher(Catcher::default());
Der standardmäßige Catcher
unterstützt das Senden von Fehlerseiten in den Formaten XML
, JSON
, HTML
und Text
.
Sie können dem standardmäßigen Catcher
durch Hinzufügen eines hoop
benutzerdefinierte Fehlerbehandlungsroutinen hinzufügen. Diese Fehlerbehandlungsroutinen sind weiterhin Handler
.
Sie können dem Catcher
mit hoop
mehrere benutzerdefinierte Fehlerbehandlungsroutinen hinzufügen. Eine benutzerdefinierte Fehlerbehandlungsroutine kann nach der Bearbeitung des Fehlers die Methode FlowCtrl::skip_next
aufrufen, um nachfolgende Fehlerbehandlungen zu überspringen und vorzeitig zurückzukehren.
custom-error-page/src/main.rs
use salvo::catcher::Catcher;
use salvo::prelude::*;
// Handler that returns a simple "Hello World" response
#[handler]
async fn hello() -> &'static str {
"Hello World"
}
// Handler that deliberately returns a 500 Internal Server Error
#[handler]
async fn error500(res: &mut Response) {
res.status_code(StatusCode::INTERNAL_SERVER_ERROR);
}
#[tokio::main]
async fn main() {
// Initialize logging system
tracing_subscriber::fmt().init();
// Create and start server with custom error handling
let acceptor = TcpListener::new("0.0.0.0:5800").bind().await;
Server::new(acceptor).serve(create_service()).await;
}
// Create service with custom error handling
fn create_service() -> Service {
// Set up router with two endpoints:
// - / : Returns "Hello World"
// - /500 : Triggers a 500 error
let router = Router::new()
.get(hello)
.push(Router::with_path("500").get(error500));
// Add custom error catcher for 404 Not Found errors
Service::new(router).catcher(Catcher::default().hoop(handle404))
}
// Custom handler for 404 Not Found errors
#[handler]
async fn handle404(&self, _req: &Request, _depot: &Depot, res: &mut Response, ctrl: &mut FlowCtrl) {
// Check if the error is a 404 Not Found
if StatusCode::NOT_FOUND == res.status_code.unwrap_or(StatusCode::NOT_FOUND) {
// Return custom error page
res.render("Custom 404 Error Page");
// Skip remaining error handlers
ctrl.skip_rest();
}
}