Catcher

Catcher 是用于处理请求出错的情况.

pub trait Catcher: Send + Sync + 'static {
    fn catch(&self, req: &Request, res: &mut Response) -> bool;
}

一个网站应用可以指定多个不同的 Catcher 对象处理错误. 它们被保存在 Service 的字段中:

pub struct Service {
    pub(crate) router: Arc<Router>,
    pub(crate) catchers: Arc<Vec<Box<dyn Catcher>>>,
    pub(crate) allowed_media_types: Arc<Vec<Mime>>,
}

可以通过 Serverwith_catchers 函数设置它们:

struct Handle404;
impl Catcher for Handle404 {
    fn catch(&self, _req: &Request, _depot: &Depot, res: &mut Response) -> bool {
        if let Some(StatusCode::NOT_FOUND) = res.status_code() {
            res.render("Custom 404 Error Page");
            true
        } else {
            false
        }
    }
}
#[tokio::main]
async fn main() {
    let router = Router::new().get(hello_world);
    let catchers: Vec<Box<dyn Catcher>> = vec![Box::new(Handle404)];
    let service = Service::new(router).with_catchers(catchers);
    Server::new(TcpListener::bind("0.0.0.0:7878"))
        .serve(service())
        .await;
}

当网站请求结果有错误时, 首先试图通过用户自己设置的 Catcher 设置错误页面, 如果 Catcher 捕获错误, 则返回 true.

如果您自己设置的 Catcher 都没有捕获这个错误, 则系统使用默认的 Catcher 实现 CatcherImpl 捕获处理错误, 发送默认的错误页面. 默认的错误实现 CatcherImpl 支持以 XML, JSON, HTML, Text 格式发送错误页面.