如何在恐慌之前使用 Result::expect 记录消息?

Erd*_*ray 5 logging rust

Result::expect对给定的消息感到恐慌。不过,我想在惊慌失措之前先记录一下。假设我使用了日志外观和实现,我想做一些事情:

// a result called `result`
result.something_like_expect(|e| {
    // assuming `e` is an error instance and implements `Display`
    error!("An error happened: {}", e);
    // and panics here
});
Run Code Online (Sandbox Code Playgroud)

使用 Rust 1.39.0 有这样的解决方案吗?

Den*_*din 7

您可以尝试map_err使用unwrap

fn main() {
    let result: Result<(), String> = Err("error message".into());
    result.map_err(|e| log::error!("Failed with: {}", e)).unwrap();
}
Run Code Online (Sandbox Code Playgroud)

但我建议你保留错误并将它们全部用anyhowcrate 向上发送:

use anyhow::Error;

fn main() -> Result<(), Error> {
    let result: Result<(), Error> = Err(Error::msg("error message"));
    let unwrapped_result = result?;
    Ok(())
}
Run Code Online (Sandbox Code Playgroud)