Macro std::try

1.0.0 · source ·
macro_rules! try {
    ($expr:expr $(,)?) => { ... };
}
👎Deprecated since 1.39.0: use the ? operator instead
Expand 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