#error #error-management #flexible #derive #snafu #context #errer

errer derive

Rust的错误管理,介于失败和SNAFU之间

6个版本

0.13.1 2019年6月29日
0.13.0 2019年6月21日
0.12.2 2019年6月21日
0.1.1 2019年6月20日

#8 in #snafu

MIT许可证

30KB
558

errer - 平滑且灵活的错误管理

结合了failure和SNAFU的思路。

概述

use errer::ErrorContext;

#[derive(Errer)]
enum Error {
    #[errer(from)] //implements From<request::Error>
    Request(request::Error),
    //implements Display
    //from specifies the base for ErrorContext, which is implemented with context
    //this generates a struct, akin to SNAFU, except you can use context on structs and enums of all kinds
    #[errer(from, context, display = "Error parsing section {}: {}", 1, 0)]
    ParsingSection { from: parse::Error, section: usize },
    #[errer(from, std, display = "IO error: {}", 0)] //std implements std::error::Error if Self: Debug + Display
    IO(io::Error)
}

res!(Error);

fn main_res() -> Res<()> {
    let data = request::do()?;
    data.parse().context(ParsingSection { section: 0 })?;

    Ok(())
}

main_res!(main_res);

一些小贴士

  • 上下文依赖于from来指定基本错误;更多详细信息请参阅内部特性
  • 您还可以使用结构体上所有属性以及枚举的外部(以设置默认值)。
  • 您可以使用#[errer(context = name)]来设置生成的上下文结构体的名称。
  • 类似地,您可以使用#[errer(from = member)]来设置from使用的成员。
  • 您还可以在枚举的外部使用display来设置周围格式字符串。
  • 并且请记住,您始终可以自己实现Display

依赖

~2MB
~45K SLoC