美文网首页
Rust Error-Chain

Rust Error-Chain

作者: 生若夏花_1ad0 | 来源:发表于2020-04-07 23:24 被阅读0次

    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<Box<StdError + Send>>,
                     pub Arc<error_chain::Backtrace>);
    
    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

          本文链接:https://www.haomeiwen.com/subject/xrsaphtx.html