#error-derive #macro-derive #error #derive #display

无std err-derive

std::error::Error 提供的派生宏

14个版本

0.3.1 2022年2月11日
0.3.0 2020年10月29日
0.2.4 2020年4月9日
0.2.3 2020年3月5日
0.1.4 2018年12月27日

#312过程宏

Download history 26481/week @ 2024-03-14 28663/week @ 2024-03-21 21499/week @ 2024-03-28 19938/week @ 2024-04-04 21305/week @ 2024-04-11 18864/week @ 2024-04-18 19991/week @ 2024-04-25 23256/week @ 2024-05-02 22467/week @ 2024-05-09 28851/week @ 2024-05-16 24183/week @ 2024-05-23 23673/week @ 2024-05-30 17879/week @ 2024-06-06 20509/week @ 2024-06-13 20105/week @ 2024-06-20 16413/week @ 2024-06-27

78,337 每月下载量
不到 79 个 Crate 中使用

MIT/Apache

22KB
310

err-derive

Build status Crates.io API Docs

一个类似失败的派生宏,用于 std Error。源代码大部分来自 failure-derive

最小Rust版本:1.34.0

动机

为什么还需要另一个错误处理库?已经有十几个了,最受欢迎的是

前者提供了一个很好的 #[derive(Fail)] 宏,但它使用自己的错误类型(Fail),并且由于 std::error::Error 正在得到修复以提供与 Fail 相同的好处,因此其使用并不被鼓励。

error-chain 支持 std::error::Error,但它使用声明性语法生成错误实现,这在我的看法中使得语法过于晦涩。

这个crate试图结合两者的优点

  • std::error::Error 一起工作
  • 提供一个自定义的 #[derive(Error)],其工作方式与 failure-derive 相同

err-derivestd 兼容,包括最近对弃用 Error::cause 并推荐使用 Error::source 的更改,并提供生成 DisplayError 模板代码的简单语法(后者99%来自 failure-derive)。

功能

err-derive 可应用于您的错误结构体/枚举,并为您执行以下操作:

  • 派生 Display 实现
  • 派生 Error 实现(实现 source 以返回错误原因)
  • 派生 From<OtherError> 实现

使用方法

Cargo.toml

[dependencies]
err-derive = "0.1"

Rust 代码

#[cfg(feature = "std")]
use std::error::Error;
#[cfg(not(feature = "std"))]
use std::fmt::Display;
use std::path::PathBuf;

use err_derive::Error;

#[derive(Debug, Error)]
pub enum FormatError {
    #[error(display = "invalid header (expected: {:?}, got: {:?})", expected, found)]
    InvalidHeader {
        expected: String,
        found: String,
    },
    #[error(display = "missing attribute: {:?}", _0)]
    MissingAttribute(String),
}

#[derive(Debug, Error)]
pub enum LoadingError {
    #[error(display = "could not decode file")]
    FormatError(#[error(source)] FormatError),
    #[error(display = "could not find file: {:?}", path)]
    NotFound { path: PathBuf },
}

fn main() {
    let my_error: LoadingError = FormatError::MissingAttribute("some_attr".to_owned()).into();

    print_error(&my_error);
}

#[cfg(feature = "std")]
fn print_error(e: &dyn Error) {
    eprintln!("error: {}", e);
    let mut cause = e.source();
    while let Some(e) = cause {
        eprintln!("caused by: {}", e);
        cause = e.source();
    }
}

#[cfg(not(feature = "std"))]
fn print_error(e: &dyn Display) {
    eprintln!("error: {}", e);
}

no_std

您可以通过禁用默认的 std 功能来在 #![no_std] 项目中使用此库。

[dependencies]
err-derive = { version = "...", default-features = false }

没有默认的 std 功能,只有 FromDisplay 实现将被派生,因为 Error 需要 std

致谢

感谢 @withoutboatsfailure的其他贡献者

许可

本项目采用 Apache-2.0 / MIT 双重许可。您可以选择其中一种许可。对项目的任何贡献都假定根据这些条款进行许可。

有关更多信息,请参阅 LICENSE、LICENSE-MITLICENSE-APACHE

依赖项

~1–10MB
~118K SLoC