请求错误处理
2026/1/2大约 1 分钟hyperlanewebrustconfigrequest_error
提示
hyperlane 框架使用 request_error 接口进行请求错误处理。
原生写法
struct RequestErrorHook {
response_status_code: ResponseStatusCode,
response_body: String,
}
impl ServerHook for RequestErrorHook {
async fn new(_: &mut Stream, ctx: &mut Context) -> Self {
let request_error: RequestError = ctx.try_get_request_error_data().unwrap_or_default();
Self {
response_status_code: request_error.get_http_status_code(),
response_body: request_error.to_string(),
}
}
async fn handle(self, stream: &mut Stream, ctx: &mut Context) -> Status {
let data: Vec<u8> = ctx
.get_mut_response()
.set_version(HttpVersion::Http1_1)
.set_status_code(self.response_status_code)
.set_body(self.response_body)
.build();
if stream.try_send(data).await.is_err() {
stream.set_closed(true);
return Status::Reject;
}
Status::Continue
}
}
let mut server: Server = Server::default();
server.request_error::<RequestErrorHook>();属性宏写法
use hyperlane::*;
use hyperlane_macros::*;
#[request_error]
struct RequestErrorHook;
impl ServerHook for RequestErrorHook {
async fn new(_: &mut Stream, ctx: &mut Context) -> Self {
Self
}
#[epilogue_macros(response_body("request_error"), send)]
async fn handle(self, stream: &mut Stream, ctx: &mut Context) -> Status {
let error: RequestError = ctx.try_get_request_error_data().unwrap_or_default();
Status::Continue
}
}使用属性宏获取请求错误数据
提示
可以使用 #[try_get_request_error_data] 或 #[request_error_data] 属性宏提取请求错误数据。
安全获取请求错误数据(返回 Option)
#[try_get_request_error_data(error_data)]
async fn handle(self, stream: &mut Stream, ctx: &mut Context) -> Status {
if let Some(data) = error_data {
// use data
}
Status::Continue
}不安全获取请求错误数据(获取失败会 Panic)
#[request_error_data(error_data)]
async fn handle(self, stream: &mut Stream, ctx: &mut Context) -> Status {
// error_data is available directly
Status::Continue
}指定执行顺序
提示
如果不指定 order 参数,钩子的优先级高于指定了 order 的钩子。
#[request_error(1)]
struct RequestErrorHook1;
#[request_error("2")]
struct RequestErrorHook2;