如何在Rust中链式处理ureq库的JSON解析失败?
Rust ureq库响应解析错误的处理方案
我使用Rust的ureq库发起URL请求,尝试将响应解析为Response枚举类型的Vec数组,现有代码如下:
let resp = ureq::get(url).call(); let results: Vec<Response> = match resp { Ok(response) => response.into_json()?, Err(Error::Status(_, response)) => { println("Handle defined error"); } Err(_) => { // Transport error println("Transport error"); } };
当前问题在于response.into_json()可能因字段不匹配等原因解析失败,我希望捕获该错误并输出易读的提示信息,同时想了解是否存在链式调用的处理方式,例如类似以下的写法:
let results: Vec<Response> = match resp { Ok(response) => response.into_json().got_error_here({ println("Failed to parse response"); }),
经过调研,我找到了三种可行的解决方案:
1. 嵌套match方案
通过嵌套match语句分别处理请求成功后的解析结果:
let results: Vec<Response> = match resp { Ok(response) => { let resp: Result<_, std::io::Error> = response.into_json(); match resp { Ok(resp) => resp, Err(_) => { println("Failed to parse response"); } } } }
2. else分支方案
利用Rust的let...else语法快速处理解析失败的情况:
let results: Vec<Response> = match resp { Ok(response) => { let resp: Result<_, std::io::Error> = response.into_json(); let Ok(resp) = resp else { println("Failed to parse response"); }; resp } }
3. unwrap_or_else链式方案
使用Result的unwrap_or_else方法实现链式调用风格的错误处理:
let results: Vec<Response> = match resp { Ok(response) => response.into_json().unwrap_or_else(|_| { println("Failed to parse response"); }), }
内容的提问来源于stack exchange,提问作者Thong Nguyen
相关产品推荐
相关产品推荐

