2 个版本

使用旧的 Rust 2015

0.1.1 2017年7月25日
0.1.0 2017年7月24日

#2049Rust 模式

MIT 许可证

21KB
265

NES

新错误系统是 Rust 的库,它使错误处理的语法更优雅。

描述

  • 它使用 Rust 的稳定版本
  • 每个错误都存储了错误发生的位置,因为一些错误如 std::io::Error 可能会在代码的不同位置发生,这对问题检测很有用。
  • 这里收集了一些宏,使语法更优雅和简洁。
  • 你可以使用自己的 ErrorInfo,它存储错误发生的位置信息。

错误信息

显示 ({})

example/examples/example.rs 16:0   //line, where impl_from_error!() is.
read file error example/examples/example.rs 51:13    //line where thr error has been occurred
Can not read file "no_file.rs" : No such file or directory (os error 2)    //description of error

调试 ({:?})

example/examples/example.rs 18:0
CommonError::ReadFileError read_file_error:example/examples/example.rs 53:13
ReadFileError::ReadFileError io_error:Error { repr: Os { code: 2, message: "No such file or directory" } } file:"no_file.rs"

如果你有想法,请在 Issues 中提出。

用法

Cargo.toml

nes = "*"
//See examples/example.rs

define_error!( ReadFileError,
    IOError(io_error:Box<std::io::Error>) => "IO Error: {}",
    ReadFileError(io_error:Box<std::io::Error>, file:String ) => "Can not read file \"{2}\" : {1}" //1,2 is order of args, note:0 is ErrorInfo
);

define_error!( CommonError,
    ReadFileError(read_file_error:Box<ReadFileError>) => "read file error {}",
    NoArguments() => "no arguments",
    IncorrectExtension(file_name:String, extension:String) => "Expected extension \"{2}\" for file \"{1}\""
);

impl_from_error!(ReadFileError => CommonError);

fn process() -> result![CommonError] {
    let lines=read_file("file.rs")?;

    for line in lines.iter() {
        print!("L:{}",line);
    }

    ok!()
}

fn read_file(file_name:String) -> result![Vec<String>,ReadFileError] {
    use std::io::prelude::*;

    let file=try!( std::fs::File::open(file_name.as_str()), ReadFileError::ReadFileError, file_name );

    let mut buf_reader = std::io::BufReader::new(file);
    let mut lines=Vec::new();
    let mut line=String::with_capacity(80);

    loop {
        match try!( buf_reader.read_line(&mut line), ReadFileError::IOError ) {
            0 => break,
            _ => lines.push(line.clone()),
        }

        line.clear();
    }

    ok!(lines)
}

许可证

MIT

无运行时依赖