【问题标题】:How do I log to a file when an error occurs while using the question mark (?) operator?使用问号 (?) 运算符时发生错误时如何记录到文件?
【发布时间】:2020-08-19 15:01:11
【问题描述】:

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

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?

【问题讨论】:

  • 您可能对tracing framework 感兴趣,尤其是使用tracing attributes 注释相关函数。
  • 谢谢。如果? 无法自定义。我想我想在跟踪框架之上实现一个像try 这样的宏。然后我可以记录文件名、行号、错误代码等来帮助分析错误

标签: error-handling rust error-logging


【解决方案1】:

不,这不会发生,并且可能出于多种原因不能

  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
    }
}

这将在每个?之前使用:

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

fn fails() -> Result<(), String> {
    Err("Oh no!".into())
}

【讨论】:

  • 我认为第 1 点和第 3 点无效。例如,Rust 允许您更改默认分配器,这会改变 box foo 的行为,即使 Rust 不需要分配器。没有什么可以阻止该语言允许配置“默认错误处理程序”来更改foo? 的行为。它只是没有实现,而且几乎永远不会实现,因为记录每一个错误很可能没有用。
  • 其实我是想记录文件名、行号、函数名、错误码等来帮助分析错误。对于第4点(Result的错误类型不保证可以格式化为文本。),我认为可以记录错误代码以外的信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-25
  • 1970-01-01
  • 1970-01-01
  • 2016-12-11
  • 2018-07-27
  • 2021-10-20
  • 2021-11-26
相关资源
最近更新 更多