3 个版本

0.1.2 2022 年 3 月 14 日
0.1.1 2022 年 1 月 1 日
0.1.0 2021 年 12 月 31 日

#2003Rust 模式

Download history 59/week @ 2024-03-24 94/week @ 2024-03-31 62/week @ 2024-04-07 35/week @ 2024-04-14 64/week @ 2024-04-21 18/week @ 2024-04-28 31/week @ 2024-05-05 55/week @ 2024-05-12 51/week @ 2024-05-19 116/week @ 2024-05-26 67/week @ 2024-06-02 53/week @ 2024-06-09 94/week @ 2024-06-16 83/week @ 2024-06-23 15/week @ 2024-06-30 26/week @ 2024-07-07

225 每月下载量
git-wire 中使用

MIT 许可证

11KB
117

cause

[Cause] 是 std::error::Error 特性的小型泛型实现。

它接受 1 个类型参数(T: Debug),用于描述发生了哪种错误类型。

它可以被解引用为 &T

如果您使用宏 [cause],它将自动存储一些额外的信息(如文件名和行号),仅在它编译时带有 debug_assertions

示例

#[derive(Debug, PartialEq, Eq)]
pub enum ErrorType {
    InvalidArgumentsError,
    InternalError,
    NotFoundError,
}

use ErrorType::*;
use cause::Cause;
use std::error::Error;

// It creates an instance of `Cause<ErrorType>`
let cause = Cause::new(InternalError);
assert_eq!(cause.to_string(), "InternalError".to_string());
assert!(cause.message().is_none());
assert!(cause.source().is_none());

// It is dereferencable.
assert_eq!(*cause, InternalError);

let http_status_code = match *cause {
    InternalError => 500,
    InvalidArgumentsError => 400,
    NotFoundError => 404,
};
assert_eq!(http_status_code, 500);

// set the message:
let cause = Cause::new(InvalidArgumentsError).msg("oops!");
assert_eq!(cause.to_string(), "InvalidArgumentsError: oops!".to_string());
assert_eq!(cause.message(), Some(&"oops!".to_string()));
assert!(cause.source().is_none());

// set the source of this error (any error type can be set with `src()`):
let cause = Cause::new(InternalError).src(Cause::new(NotFoundError));
assert_eq!(
    cause.to_string(),
    "InternalError\n\nCaused by:\n    NotFoundError\n".to_string()
);
assert!(cause.message().is_none());
assert!(cause.source().is_some());

// an example of Cause who have a standard io error.
use std::io::Error as IoErr;
use std::io::ErrorKind;
let io_err = IoErr::new(ErrorKind::Other, "oh no!");
println!("{}", Cause::new(InternalError).src(io_err).msg("internal error caused by io error"));

// a couple of macro examples
use cause::cause;

let cause = cause!(InternalError);
println!("{}", cause);
  // => "InternalError" on release build
  // => "InternalError: [lib.rs:64]" on debug build

let cause = cause!(NotFoundError, "There is no such contents.");
println!("{}", cause);
  // => "InternalError: There is no such contents." on release build
  // => "InternalError: There is no such contents. [lib.rs:69]" on debug build

变更日志

0.1.2

  • 修复了 cause 宏问题,即隐式需要 use cause::Cause,

0.1.1

已添加以下获取方法到 [Cuase].

  • Cause::消息()
  • Cuase::cause()

0.1.0

初始版本

许可证

MIT 许可证 (MIT)

版权 (c) 2021 msr1k

无运行时依赖