这就是我所拥有的,但我想避免使用unwrap我的 reqwest 值:
extern crate base64;
extern crate reqwest;
use serde_json;
use serde_json::json;
pub fn perform_get(id: String) -> serde_json::value::Value {
let client = reqwest::Client::builder().build().unwrap();
let url = String::from("SomeURL");
let res = client.get(&url).send().unwrap().text();
let mut v = json!(null);
match res {
Ok(n) => {
v = serde_json::from_str(&n).unwrap();
}
Err(r) => {
println!("Something wrong happened {:?}", r);
}
}
v
}
fn main() {
println!("Hi there! i want the function above to return a result instead of a Serde value so I can handle the error in main!");
}
Run Code Online (Sandbox Code Playgroud)
Rust 官方书籍《Rust 编程语言》可在线免费获取。它有一整章关于使用Result,解释介绍性主题,例如Result枚举以及如何使用它。
如何返回
Result包含a的aserde_json::Value?
与返回任何Result类型的a 的方式相同;没有什么特别之处:Value
use serde_json::json; // 1.0.38
pub fn ok_example() -> Result<serde_json::value::Value, i32> {
Ok(json! { "success" })
}
pub fn err_example() -> Result<serde_json::value::Value, i32> {
Err(42)
}
Run Code Online (Sandbox Code Playgroud)
如果您有一个返回 a 的函数Result,则可以使用问号运算符 ( ?) 在出错时提前退出函数并返回错误。这是避免unwrapor的简洁方法expect:
fn use_them() -> Result<(), i32> {
let ok = ok_example()?;
println!("{:?}", ok);
let err = err_example()?;
println!("{:?}", err); // Never executed, we always exit due to the `?`
Ok(()) // Never executed
}
Run Code Online (Sandbox Code Playgroud)
这只是一个基本示例。
应用于您的MCVE,它看起来像:
use reqwest; // 0.9.10
use serde_json::Value; // 1.0.38
type Error = Box<dyn std::error::Error>;
pub fn perform_get(_id: String) -> Result<Value, Error> {
let client = reqwest::Client::builder().build()?;
let url = String::from("SomeURL");
let res = client.get(&url).send()?.text()?;
let v = serde_json::from_str(&res)?;
Ok(v)
}
Run Code Online (Sandbox Code Playgroud)
在这里,我使用特征对象 Box<dyn std::error::Error>来处理任何类型的错误(非常适合快速程序和示例)。然后,我洒?在每个可能失败的方法上(即返回 a ),并以显式的最终值Result结束该函数。Ok
请注意,可以使用此样式删除panic和 从未使用过的值。null
也可以看看:
更好的做法是返回
Result
也可以看看:
| 归档时间: |
|
| 查看次数: |
3871 次 |
| 最近记录: |