5 个版本 (稳定版)
使用旧 Rust 2015
1.2.1 | 2018 年 8 月 8 日 |
---|---|
1.2.0 | 2018 年 6 月 28 日 |
1.1.0 | 2016 年 6 月 2 日 |
1.0.0 | 2016 年 3 月 9 日 |
0.2.0 | 2016 年 6 月 1 日 |
#254 在 调试 中
24,067 每月下载量
在 119 个代码包中 使用(78 个直接使用)
17KB
206 行
Rust 的 unwrap!
宏。
该代码包提供了两个宏,unwrap!
和 unwrap_err!
。前者可用于展开 Result
或 Option
(或任何实现了 VerboseUnwrap
的类型)的值,相当于调用 unwrap()
。后者可用于展开 Result
(或任何实现了 VerboseUnwrapErr
的类型)的错误,相当于调用 unwrap_err()
。
使用这些宏而不是 .unwrap()
、.expect()
、.unwrap_err()
或 .expect_err()
方法的好处是,在 panic 时,它们会打印出宏被调用的文件名、行号、列号和函数名。
示例
此代码
let x: Result<(), u32> = Err(123);
let y = unwrap!(x);
会引发以下消息的 panic
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! unwrap! called on Result::Err !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
example.rs:2,9 in example_module::example_function
Err(123)
unwrap!
也可以带有一个可选的错误消息。这是一个格式字符串和参数。
let x: Option<()> = None;
let y = unwrap!(x, "Oh no! {}", 123);
打印
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! unwrap! called on Option::None !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
example.rs:2,9 in example_module::example_function
Oh no! 123
类似地,对于 unwrap_err!
此代码
let x: Result<u32, ()> = Ok(456);
let y = unwrap_err!(x);
会引发以下消息的 panic
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! unwrap_err! called on Result::Ok !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
example.rs:2,9 in example_module::example_function
Ok(456)
实现
unwrap 代码包为可展开的类型提供了一个 trait。
trait VerboseUnwrap {
type Wrapped;
fn verbose_unwrap(self, message: Option<std::fmt::Arguments>,
module_path: &str,
file: &str,
line_number: u32,
column: u32) -> Self::Wrapped;
}
这通过 Result
和 Option
两种方式实现。宏 unwrap! 简单地调用了这个特质的这个方法
macro_rules! unwrap(
($e:expr) => (
$crate::VerboseUnwrap::verbose_unwrap($e, None, module_path!(), file!(), line!(), column!())
);
($e:expr, $($arg:tt)*) => (
$crate::VerboseUnwrap::verbose_unwrap($e, Some(format_args!($($arg)*)), module_path!(), file!(), line!(), column!())
);
);
同样,还有一个特质用于可以展开内部错误类型的类型。
pub trait VerboseUnwrapErr {
type Wrapped;
fn verbose_unwrap_err(self, message: Option<Arguments>,
module_path: &str,
file: &str,
line_number: u32,
column: u32) -> Self::Wrapped;
}
这通过 Result
实现,而宏 unwrap_err! 调用了这个特质的方法
macro_rules! unwrap_err(
($e:expr) => (
$crate::VerboseUnwrapErr::verbose_unwrap_err($e, None, module_path!(), file!(), line!(), column!())
);
($e:expr, $($arg:tt)*) => (
$crate::VerboseUnwrapErr::verbose_unwrap_err($e, Some(format_args!($($arg)*)), module_path!(), file!(), line!(), column!())
);
);
用法
将此添加到 Cargo.toml
的依赖项中
unwrap = "~1.1.0"
然后使用 #[macro_use]
导入它
#[macro_use]
extern crate unwrap;