Rust Error-Chain

Error-Chain是rust常用的错误处理库,目的是方便程序员更好的进行程序的错误管理。这就要说到默认库实现有什么不足。

传统的错误实现方式

需要为统一一个Error结构体,并且每一个成员都要实现fmt,display,from
具体可以看这篇文章

使用Error-Chain的方式

use main_crate::*;

pub mod other_crate{
    use error_chain::*;
    error_chain! {
        errors{

        }
    }
}

pub mod main_crate{
    use error_chain::*;
    use crate::other_crate;
    error_chain!{
    //定义当前crate的错误
        errors{
            example1ErrorKind(t:String){
                description("example error 1")
                display("this is example error 1 {}",t)
            }
            example2ErrorKind(t:String){
                description("example error 2")
                display("this is example error 2{}",t)
            }
        }

        //把其他crate定义的error_chain中错误进行转换
        links{
            example3ErrorKind(other_crate::Error,other_crate::ErrorKind);
        }

        //转换标准库中的错误
        foreign_links{
            Fmt(::std::fmt::Error);
            Io(::std::io::Error);
        }
    }
}

fn foo() -> Result<()> {
    //也可以采用 Err(ErrorKind::example1ErrorKind(String::from("foo error")).into())
    //也可以采用 bail!(ErrorKind::example1ErrorKind(String::from("foo error")))
    Err(ErrorKind::example1ErrorKind(String::from("foo error")))?
}



fn main() {
    match foo() {
        Ok(_) => {
            println!("ok");
        }
        Err(e) => {
            println!("result is: {}",e);
        }
    }
}

使用Error-chain库会通过声明宏的方式自动转换为如下的程序,具体内容可以展开宏
cargo ristc -- -Z unstable-options --pretty=expanded

use std::error::Error as StdError;
use std::sync::Arc;

#[derive(Debug)]
pub struct Error(pub ErrorKind,
                 pub Option>,
                 pub Arc);

impl Error {
    pub fn kind(&self) -> &ErrorKind { ... }
    pub fn into_kind(self) -> ErrorKind { ... }
    pub fn iter(&self) -> error_chain::ErrorChainIter { ... }
    pub fn backtrace(&self) -> &error_chain::Backtrace { ... }
}

impl StdError for Error { ... }
impl Display for Error { ... }

#[derive(Debug)]
pub enum ErrorKind {
    Msg(String),
    example1ErrorKind(String),
    example2ErrorKind(String),
    example3ErrorKind(other_crate::ErrorKind),
    Fmt(::std::fmt::Error),
    Io(::std::io::Error),
}

所以通过这样的方式,就省去了我们大量的时间
最终输出结果为
result is:this is example error 1 foo error

参考资料:
官方文档说明
其他人的例子
https://users.rust-lang.org/t/announcing-error-chain-a-library-for-consistent-and-reliable-rust-error-handling/6133
https://brson.github.io/2016/11/30/starting-with-error-chain

你可能感兴趣的:(Rust Error-Chain)