如何从主结果处理程序中删除默认 "Error"

How to remove default "Error" from main Result handler

我正在尝试创建自己的自定义错误,但我不希望 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(())
}

预期 输出(标准错误):

Test

实际 输出(标准错误):

Error: Test

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

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

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

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

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