error-handling - 如何从主结果处理程序中删除默认的 “Error”

标签 error-handling rust main boilerplate

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

最佳答案

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中访问与平台相关的成功和失败代码的方法。
  • 关于error-handling - 如何从主结果处理程序中删除默认的 “Error”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63048619/

    相关文章:

    firebase - 在Flutter中捕获云Firestore文档快照错误

    rust - 在 Rust 中建模分层树

    rust - 在 Rust 中创建动态二维数组的正确语法是什么?

    c# - C# 命令行中的自定义主入口点参数

    php - 异常代码的严重性

    python - TypeError 'DataFrame'对象不可调用

    python - 为什么不能通过 try-except 处理 "io.UnsupportedOperation"错误

    traits - 我可以静态借用对特征对象的引用吗?

    java - “找不到或加载主类”是什么意思?

    java - “找不到或加载主类”是什么意思?