我注意到 rust 病也没有例外.如何处理 rust 迹中的错误,常见的trap 是什么?有没有办法通过提升、捕获、重新提升和其他方式来控制流量?我发现这方面的信息不一致.
我注意到 rust 病也没有例外.如何处理 rust 迹中的错误,常见的trap 是什么?有没有办法通过提升、捕获、重新提升和其他方式来控制流量?我发现这方面的信息不一致.
Rust通常通过两种方式解决错误:
Unrecoverable errors.一旦你panic!
岁了就够了.您的程序或线程中止,因为它遇到了无法解决的问题,并且其不变量已被违反.例如,如果你在UTF-8字符串中发现无效序列.
Recoverable errors.在一些文件中也被称为失败.你没有惊慌失措,而是发出Option<T>
或Result<T, E>
的声音.在这些情况下,可以分别 Select 有效值Some(T)
/Ok(T)
或无效值None
/Error(E)
.通常None
用作null
替换,表示缺少该值.
现在是最难的部分.应用
有时候,处理Option
是件令人头疼的事,你几乎可以保证得到一个值,而不是一个错误.
在这种情况下,使用unwrap
是完全可以的.unwrap
把Some(e)
和Ok(e)
变成e
,否则它就会panic ."展开"是一种将可恢复的错误转化为不可恢复的错误的工具.
if x.is_some() {
y = x.unwrap(); // perfectly safe, you just checked x is Some
}
在if
号区块内,完全可以打开,因为它永远不会惊慌失措,因为我们已经判断过它是Some
和x.is_some()
.
如果你正在写一个库,不鼓励使用unwrap
,因为当它惊慌失措时,用户无法处理错误.此外,future 的更新可能会更改不变量.想象一下,如果上面的例子有if x.is_some() || always_return_true()
.不变量会改变,unwrap
可能会panic .
?
operator / try!
macro什么是?
运算符还是try!
宏?一个简短的解释是,它要么返回Ok()
中的值,要么过早返回错误.
下面是运算符或宏展开的简化定义:
macro_rules! try {
($e:expr) => (match $e {
Ok(val) => val,
Err(err) => return Err(err),
});
}
如果你这样使用它:
let x = File::create("my_file.txt")?;
let x = try!(File::create("my_file.txt"));
它会将其转换为:
let x = match File::create("my_file.txt") {
Ok(val) => val,
Err(err) => return Err(err),
};
缺点是你的函数现在返回Result
.
Option
和Result
有一些方便的方法,允许以可理解的方式链接和处理错误.方法and
、and_then
、or
、or_else
、ok_or
、map_err
等.
例如,如果值出错,可以使用默认值.
let x: Option<i32> = None;
let guaranteed_value = x.or(Some(3)); //it's Some(3)
或者如果你想把你的Option
变成Result
.
let x = Some("foo");
assert_eq!(x.ok_or("No value found"), Ok("foo"));
let x: Option<&str> = None;
assert_eq!(x.ok_or("No value found"), Err("No value found"));
这只是对你能做的事情的简要介绍.有关更多说明,请查看: