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

Error handling 使用问号(?)运算符时发生错误时,如何登录到文件?,error-handling,rust,error-logging,Error Handling,Rust,Error Logging,动机:我想记录文件名、行号、函数名、错误代码等,以帮助分析错误 Rust有?进行错误处理。如果?中有错误,我想将信息记录到文件中。如何做到这一点 代码: 不,这种情况不会发生,而且可能由于多种原因,无法: Rust该语言旨在运行在甚至没有文件概念的系统上,因此需要它来实现像?这样的基本功能是不可能的 ?可用于结果之外的其他类型,如选项或轮询。这些应该记录到文件中吗 您甚至会如何配置要登录的文件 Result的错误类型不能保证它可以格式化为文本 相反,我要添加一个扩展特性: 不,这种情况不会发生,

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

Rust有
进行错误处理。如果
中有错误,我想将信息记录到文件中。如何做到这一点

代码:


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

  • Rust该语言旨在运行在甚至没有文件概念的系统上,因此需要它来实现像
    这样的基本功能是不可能的
  • 可用于
    结果
    之外的其他类型,如
    选项
    轮询
    。这些应该记录到文件中吗
  • 您甚至会如何配置要登录的文件
  • Result
    的错误类型不能保证它可以格式化为文本
  • 相反,我要添加一个扩展特性:


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

  • Rust该语言旨在运行在甚至没有文件概念的系统上,因此需要它来实现像
    这样的基本功能是不可能的
  • 可用于
    结果
    之外的其他类型,如
    选项
    轮询
    。这些应该记录到文件中吗
  • 您甚至会如何配置要登录的文件
  • Result
    的错误类型不能保证它可以格式化为文本
  • 相反,我要添加一个扩展特性:


    我认为第1点和第3点是无效的。例如,Rust允许您更改默认的分配器,该分配器会更改
    box foo
    的行为,即使Rust不需要分配器。没有什么可以阻止语言允许配置“默认错误处理程序”来更改
    foo?
    的行为。它只是没有实现,而且大多数情况下永远也不会实现,因为记录每一个错误很可能没有用处。实际上,我想记录文件名、行号、函数名、错误代码等,以帮助分析错误。对于第4点(结果的错误类型不能保证它可以格式化为文本),我认为可以记录错误代码以外的信息。我不认为第1点和第3点是有效的。例如,Rust允许您更改默认的分配器,该分配器会更改
    box foo
    的行为,即使Rust不需要分配器。没有什么可以阻止语言允许配置“默认错误处理程序”来更改
    foo?
    的行为。它只是没有实现,而且大多数情况下永远也不会实现,因为记录每一个错误很可能没有用处。实际上,我想记录文件名、行号、函数名、错误代码等,以帮助分析错误。对于第4点(结果的错误类型不能保证它可以被格式化为文本),我认为可以记录错误代码以外的信息。您可能会感兴趣,特别是通过用.Thx注释相关函数。如果
    无法自定义。我想我想在跟踪框架的基础上实现一个宏,比如
    try
    。然后我可以记录文件名、行号、错误代码等,以帮助分析您可能感兴趣的错误,特别是通过用.Thx注释相关函数。如果
    无法自定义。我想我想在跟踪框架的基础上实现一个宏,比如
    try
    。然后我可以记录文件名、行号、错误代码等,以帮助分析错误
    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?
    
    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())
    }