使用问号 (?) 运算符时发生错误时如何记录到文件?

1 error-handling error-logging rust

动机:我想记录文件名、行号、函数名、错误代码等以帮助分析错误

Rust 必须?进行错误处理。如果?. 如何实现这一目标?

代码:

let a = do_some_function_may_return_error()?;   // Does it auto log the error info when error occurs?
let b = a.do_another_function_may_return_error()?; // Does it auto log the error info when error occurs?
Run Code Online (Sandbox Code Playgroud)

She*_*ter 5

不,这种情况不会发生,并且可能由于多种原因而无法发生:

  1. Rust 语言旨在在甚至没有文件概念的系统上运行,因此需要它来完成一些基本的事情,这?可能是不可能的。
  2. ?除 之外还可以用于其他类型Result,例如OptionPoll。这些应该记录到文件中吗?
  3. 您将如何配置要登录的文件?
  4. 的错误类型Result不保证它可以被格式化为文本。

相反,我会添加一个扩展特征

trait LogExt {
    fn log(self) -> Self;
}

impl<T, E> LogExt for Result<T, E>
where
    E: std::fmt::Display,
{
    fn log(self) -> Self {
        if let Err(e) = &self {
            eprintln!("An error happened: {}", e);
        }
        self
    }
}
Run Code Online (Sandbox Code Playgroud)

这将在每个之前使用?

fn main() -> Result<(), String> {
    fails().log()?;
    Ok(())
}

fn fails() -> Result<(), String> {
    Err("Oh no!".into())
}
Run Code Online (Sandbox Code Playgroud)