Capturador

Si el código de estatus Response es un error, y el Body de Response se encuentra vacio, entonces salvo pudiera intentar usar el Catcher para capturar el error y mostrar una página de error amigable.

Una forma fácil para crear un Catcher personalizado es retornar Catcher el predeterminado del sistema vía Catcher::default(), y agregar éste al Service como se muestra a continuación.

use salvo::catcher::Catcher;

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

Por defecto Catcher soporta envío de página de erroresen formato XML, JSON, HTML y Text .

Puedes agregar un manejador de errores personalizados al Catcher agregando en el hoop por defecto el Catcher. El manejador de errores se encuentra en Handler.

Puedes agregar múltiples manejadores de errores personalizados al Catcher a través de hoop. El controlador de errores personalizado puede llamar al método FlowCtrl::skip_next después de controlar el error para omitir los siguientes errores.

use salvo::catcher::Catcher;
use salvo::prelude::*;

#[handler]
async fn hello() -> &'static str {
    "Hello World"
}
#[handler]
async fn error500(res: &mut Response) {
    res.status_code(StatusCode::INTERNAL_SERVER_ERROR);
}

#[tokio::main]
async fn main() {
    tracing_subscriber::fmt().init();

    let acceptor = TcpListener::new("127.0.0.1:5800").bind().await;
    Server::new(acceptor).serve(create_service()).await;
}

fn create_service() -> Service {
    let router = Router::new()
        .get(hello)
        .push(Router::with_path("500").get(error500));
    Service::new(router).catcher(Catcher::default().hoop(handle404))
}

#[handler]
async fn handle404(res: &mut Response, ctrl: &mut FlowCtrl) {
    if let Some(StatusCode::NOT_FOUND) = res.status_code {
        res.render("Custom 404 Error Page");
        ctrl.skip_rest();
    }
}
[package]
name = "example-custom-error-page"
version = "0.1.0"
edition = "2021"
publish = false


[dependencies]
salvo.workspace = true
tokio = { version = "1", features = ["macros"] }
tracing = "0.1"
tracing-subscriber = "0.3"