macro_rules! try { ($expr:expr $(,)?) => { ... }; }
👎Deprecated since 1.39.0: use the
?
operator insteadExpand description
解开结果或传播其错误。
添加了 ?
operator 以替换 try!
,应改为使用。
此外,try
是 Rust 2018 中的保留字,所以如果必须使用它,则需要使用
raw-identifier syntax: r#try
。
try!
匹配给定的 Result
。对于 Ok
变体,表达式具有包装值的值。
对于 Err
变体,它检索内部错误。try!
然后使用 From
执行转换。
这样可以在特殊错误和更常见错误之间进行自动转换。
然后立即返回产生的错误。
由于提前返回,因此只能在返回 Result
的函数中使用 try!
。
Examples
use std::io;
use std::fs::File;
use std::io::prelude::*;
enum MyError {
FileWriteError
}
impl From<io::Error> for MyError {
fn from(e: io::Error) -> MyError {
MyError::FileWriteError
}
}
// 快速返回错误的首选方法
fn write_to_file_question() -> Result<(), MyError> {
let mut file = File::create("my_best_friends.txt")?;
file.write_all(b"This is a list of my best friends.")?;
Ok(())
}
// 快速返回错误的先前方法
fn write_to_file_using_try() -> Result<(), MyError> {
let mut file = r#try!(File::create("my_best_friends.txt"));
r#try!(file.write_all(b"This is a list of my best friends."));
Ok(())
}
// 这相当于:
fn write_to_file_using_match() -> Result<(), MyError> {
let mut file = r#try!(File::create("my_best_friends.txt"));
match file.write_all(b"This is a list of my best friends.") {
Ok(v) => v,
Err(e) => return Err(From::from(e)),
}
Ok(())
}
Run