【问题标题】:How to remove default "Error" from main Result handler如何从主结果处理程序中删除默认的“错误”
【发布时间】:2020-07-23 07:00:26
【问题描述】:

我正在尝试制作自己的自定义错误,但我不希望 Rust 自动在错误消息前添加 Error: 。我该怎么做?

代码:

use std::error::Error;
use std::fmt;

#[derive(Debug)]
enum CustomError {
    Test
}
impl fmt::Display for CustomError {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        match *self {
            CustomError::Test => write!(f, "Test")
        }
    }
}

fn main() -> Result<(), CustomError> {
    Err(CustomError::Test)?;
    Ok(())
}

预期输出(stderr):

Test

实际输出(stderr):

Error: Test

【问题讨论】:

  • 在这种情况下进程将退出并显示错误代码,您可以考虑在 main 中处理错误而不是传播。
  • 我不确定你的意思是什么,你能澄清一下吗?我确实通过 Result. 强制错误代码来测试该过程
  • 我在想这样的事情:play.rust-lang.org/…

标签: error-handling rust main boilerplate


【解决方案1】:

Error: 前缀由Termination implementation for Result 添加。避免它的最简单选择是让main() 返回(),然后在main() 中自己处理错误。示例:

fn foo() -> Result<(), CustomError> {
    Err(CustomError::Test)?;
    Ok(())
}

fn main() {
    if let Err(e) = foo() {
        eprintln!("{:?}", e);
    }
}

如果你可以使用不稳定的功能,你也可以

  • 在自定义结果类型上实现TerminationTry 特征,这将允许您使用main() 中的原始代码,但自定义其行为。 (对于这个简单的案例,这对我来说似乎有点过头了。)
  • 从 main 返回一个ExitCode,它允许你指明ExitCode::SUCCESSExitCode::FAILURE。您也可以使用 std::process::exit() 设置退出代码,但我不知道在稳定的 Rust 中访问依赖于平台的成功和失败代码的方法。

【讨论】:

猜你喜欢
  • 2016-09-02
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 2016-06-20
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多