我尝试使用嵌套的match
臂,它们都使用相同的代码处理Err
情况。
这看起来相当重复,如果要做进一步的解析和解 Package ,情况会变得更糟。
有没有办法让Err
用例从内臂“冒泡”到外臂,或者对多个不同的、可能嵌套的Err
用例应用相同的错误处理?
pub fn get_content_length(
headers: axum::http::HeaderMap,
) -> Result<usize, (axum::http::StatusCode, String)> {
let content_length = match headers.get("content-length") {
Some(header_val) => match header_val.to_str() {
Ok(header_val) => match header_val.parse::<usize>() {
Ok(content_length) => content_length,
Err(e) => {
return Err((
axum::http::StatusCode::BAD_REQUEST,
format!("error parsing header content-length: {}", e.to_string()),
))
}
},
Err(e) => {
return Err((
axum::http::StatusCode::BAD_REQUEST,
format!("error parsing header content-length: {}", e.to_string()),
))
}
},
None => {
return Err((
axum::http::StatusCode::BAD_REQUEST,
String::from("missing content-length header"),
))
}
};
Ok(content_length)
}
1条答案
按热度按时间v7pvogib1#
你可以用if-let或let-else结构来简化你的代码。你的例子太大了,我无法展示结构的用法,抱歉。以后的MRE使用playground。
但最简单的错误方式-anyhow crate。