Catcher
如果 Response
的狀態碼是錯誤, 而頁麵裏麵的 Body
是空, 這時 salvo 會試圖使用 Catcher
捕獲這個錯誤, 顯示一個友好的錯誤頁麵.
可以通過 Catcher::default()
返回一個係統默認的 Catcher
, 然後講它添加到 Service
上.
use salvo::catcher::Catcher;
Service::new(router).catcher(Catcher::default());
默認的 Catcher
支持以 XML
, JSON
, HTML
, Text
格式發送錯誤頁麵.
可以通過給這個默認的 Catcher
添加 hoop
的方式, 把自定義的錯誤捕獲程序添加到Catcher
上. 這個錯誤捕獲的程序依然是 Handler
.
你可以通過 hoop
為 Catcher
添加多個自定義的錯誤捕獲程序. 自定義的錯誤處理程序可以在處理錯誤後調用 FlowCtrl::skip_next
方法跳過後續錯誤程序,提前返回.
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 StatusCode::NOT_FOUND == res.status_code.unwrap_or(StatusCode::NOT_FOUND) {
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"