error-handling - 我对以下 Rust“reqwest”代码的理解是否正确?
问题描述
我一直在玩 Rust 并且遇到了以下代码:
fn request(&url) -> Result<(), Box<dyn std::error::Error>> {
let mut res = reqwest::get(&url)?;
let mut body = String::new();
res.read_to_string(&mut body)?;
println!("Status: {}", res.status());
println!("Headers:\n{:#?}", res.headers());
println!("Body:\n{}", body);
Ok(())
}
我的理解是:
fn request(&url) -> Result<(), Box<dyn std::error::Error>> {
定义具有单个(借用)参数并用于Result
处理错误的函数。
let mut res = reqwest::get(&url)?;
定义一个可变变量来存储来自reqwest
crateget
方法的响应对象。
let mut body = String::new();
定义一个可变变量来存储 responseText 字符串。
res.read_to_string(&mut body)?;
此方法将 存储responseText
在body
变量中。
println!("Status: {}", res.status());
println!("Headers:\n{:#?}", res.headers());
println!("Body:\n{}", body);
打印三个包含响应状态、标题和正文的格式化字符串(带有尾随的新行)。
Ok(())
Result
通过..?处理错误?
问题:
- 空括号是什么
Result<()
意思OK(())
/做什么? - 是什么
Box<dyn std::error::Error>
?
解决方案
你的理解完全正确。
Result 是一个 Enum,可以是“Ok”或“Err”——如果 Ok,那么可能有一些正常值(结果、响应、数据、输出等);同样,如果 Err,那么您可能想要传达一些具体的错误。有了这个,让我们分解结果。
应该这样读:
Result<TypeOfValueIfOkay, TypeOfErrorWhenNotOkay>
. 这两种子类型可以是任何东西,但它们必须是某种东西——不能忽略它。所以 if
TypeOfValueIfOkay
必须是一些东西,但如果你不想返回一些东西,你可以返回一个空的Tuple。这就是()
结果。它只是有效地说“当一切顺利时,我什么都不返回”。那么第二部分
TypeOfErrorWhenNotOkay
也可以是任何类型——字符串、int 等等。它有助于类型实现std::error::Error
帮助调用者标准化的特征。如果要将其返回到调用者的堆栈中,则返回“一些动态对象但实现了 trait
std::error::Error
”需要 Rust 知道该值的确切大小(调用者的堆栈需要调整大小以接受它。)这就是
Box
类型的来源——它将实际值推送到堆上并保存一个指向它的指针(无论堆上的实际值如何,它都可以是可预测的固定大小。)这<dyn std::error::Error>
是保证无论装箱值是什么,它实现了 Error trait。所以现在决赛
Ok(())
是有道理的。如果您阅读Ok(value)
:它说 Result 枚举是变体Ok
,其值为 "empty tuple"()
,即什么都没有。
推荐阅读
- c++ - C++11 memory_model_relaxed和memory_order_seq_cst的关系
- html - 带有固定宽度左右侧边栏的 flex 内部网格
- mysql - 通过 PHP 组合 MySQL 表
- android - 同一广告 ID 的多种奖励
- jekyll - 将“link”和“post_url”与变量一起使用
- azure - Azure Form Recognizer boundingBox 结果转换为 XY 坐标
- python - 将输出保存到文本文件
- javascript - 用javascript创建提交按钮,按钮不起作用
- php - 如何通过移动到新行来防止图像溢出 div 块?
- git - 运行 Castro 用户指南时遇到问题