6 个版本
使用旧的 Rust 2015
0.1.5 | 2017 年 4 月 9 日 |
---|---|
0.1.4 | 2017 年 2 月 8 日 |
0.1.3 | 2017 年 1 月 20 日 |
#2651 in Rust 模式
535 个月下载量
用于 parallel-event-emitter
20KB
246 行
trace-error
Rust 错误系统的扩展,自动包含回溯到错误源的确切位置。
将其视为 error_chain
和类似软件包的更轻量级、更少使用宏的替代品。此软件包不负责实际定义错误及其变体,而只关注一个用于持有错误及其来源回溯的薄容器。
Trace
和 TraceResult
应通常使用宏 throw!
、try_throw!
和 try_rethrow!
替换 Result
。
尽管刚刚引入了 ?
语法,但由于 Carrier
特性尚未稳定,trace-error
还不兼容它。因此,如果您打算充分利用此软件包,应将所有 try!
和 ?
实例替换为 try_throw!
。然而,当返回值也是 Result
时,可以使用 Trace
来实现 Result
,只需因为 From
特性已经实现了自身类型。
此外,如果您必须直接使用 Result
而不是立即返回它,可以使用 trace_error!
宏来创建具有所需错误值的 Result
。
如果返回的 Trace
不包含相同的错误类型,但它们是可转换的,请使用 try_rethrow!
来转换内部错误类型。
示例
#[macro_use]
extern crate trace_error;
use std::error::Error;
use std::fmt::{Display, Formatter, Result as FmtResult};
use std::io;
use std::fs::File;
use trace_error::TraceResult;
pub type MyResultType<T> = TraceResult<T, MyErrorType>;
#[derive(Debug)]
pub enum MyErrorType {
Io(io::Error),
ErrorOne,
ErrorTwo,
//etc
}
impl Display for MyErrorType {
fn fmt(&self, f: &mut Formatter) -> FmtResult {
write!(f, "{}", self.description())
}
}
impl Error for MyErrorType {
fn description(&self) -> &str {
match *self {
MyErrorType::Io(ref err) => err.description(),
MyErrorType::ErrorOne => "Error One",
MyErrorType::ErrorTwo => "Error Two",
}
}
}
impl From<io::Error> for MyErrorType {
fn from(err: io::Error) -> MyErrorType {
MyErrorType::Io(err)
}
}
fn basic() -> MyResultType<i32> {
Ok(42)
}
fn example() -> MyResultType<()> {
// Note the use of try_rethrow! for TraceResult results
let meaning = try_rethrow!(basic());
// Prints 42 if `basic` succeeds
println!("{}", meaning);
// Note the use of try_throw! for non-TraceResult results
let some_file = try_throw!(File::open("Cargo.toml"));
Ok(())
}
fn main() {
match example() {
Ok(_) => println!("Success!"),
// Here, err is the Trace<E>, which can be printed normally,
// showing both the error and the backtrace.
Err(err) => println!("Error: {}", err)
}
}
依赖项
~2.5–3.5MB
~72K SLoC