如何为所有现有错误实现错误包装?

Amo*_*mos 13 rust

我想在所有函数中使用我自定义的错误类型,我需要包装现有的标准错误,以便?操作员成功.

这是我在做的事情:

use std::{error::Error, fmt, fs};

#[derive(Debug)]
enum MyError {
    A,
    B,
}

impl fmt::Display for MyError {
    fn fmt(&self, _f: &mut fmt::Formatter) -> fmt::Result {
        Ok(())
    }
}

impl Error for MyError {
    fn description(&self) -> &str {
        ""
    }
}

trait NotMyError {}

impl<T: NotMyError + Error> From<T> for MyError {
    fn from(_: T) -> MyError {
        MyError::A
    }
}

fn test() -> Result<(), MyError> {
    fs::read_dir("test")?;
    Ok(())
}

fn main() {}
Run Code Online (Sandbox Code Playgroud)

编译器抱怨:

error[E0277]: the trait bound `std::io::Error: NotMyError` is not satisfied
  --> src/main.rs:30:5
   |
30 |     fs::read_dir("test")?;
   |     ^^^^^^^^^^^^^^^^^^^^^ the trait `NotMyError` is not implemented for `std::io::Error`
   |
   = note: required because of the requirements on the impl of `std::convert::From<std::io::Error>` for `MyError`
   = note: required by `std::convert::From::from`
Run Code Online (Sandbox Code Playgroud)

Kor*_*nel 9

一个关于它的优秀岗位.要获得对错误的一流支持,您需要做两件事:

  • 实现Error特质为你的类型.
  • 实现std::convert::From您希望与?运算符无缝使用的错误类型(quick_error crate有助于自动执行此操作).