Catcher

Lorsqu'une Response renvoie un code d'état d'erreur et que le Body dans la page est vide, Salvo tentera d'intercepter cette erreur à l'aide d'un Catcher et affichera une page d'erreur conviviale.

Vous pouvez obtenir un Catcher par défaut du système en appelant Catcher::default(), puis l'ajouter au Service.

use salvo::catcher::Catcher;

Service::new(router).catcher(Catcher::default());

Le Catcher par défaut prend en charge l'envoi de pages d'erreur aux formats XML, JSON, HTML et Text.

Vous pouvez ajouter des gestionnaires d'erreurs personnalisés au Catcher en attachant des hoops à ce Catcher par défaut. Ces gestionnaires d'erreurs sont toujours de type Handler.

Vous pouvez ajouter plusieurs gestionnaires d'erreurs personnalisés au Catcher via des hoops. Les gestionnaires d'erreurs personnalisés peuvent appeler la méthode FlowCtrl::skip_next après avoir traité une erreur pour ignorer les gestionnaires d'erreurs suivants et retourner plus tôt.

main.rs
Cargo.toml
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:8698").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();
    }
}