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 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"