failures_crate/
lib.rs

1//! # failure 使用代码示例
2//!
3//!  使用第三方failure库统一管理错误
4extern crate failure;
5#[macro_use] extern crate failure_derive;
6
7use failure::{Context, Fail, Backtrace};
8use std::fs::File;
9use std::io::prelude::*;
10
11
12/// # 使用Error来统一管理错误
13#[derive(Debug)]
14pub struct Error {
15    inner: Context<ErrorKind>,
16}
17/// # ErrorKind记录各种错误
18#[derive(Debug, Fail)]
19pub enum ErrorKind {
20     #[fail(display = "IoError")]
21    Io(#[cause] std::io::Error),
22    #[fail(display = "ParseError")]
23    Parse(#[cause] std::num::ParseIntError),
24    // ADD new Error Kind
25}
26
27impl Fail for Error {
28    fn cause(&self) -> Option<&Fail> {
29        self.inner.cause()
30    }
31     fn backtrace(&self) -> Option<&Backtrace> {
32        self.inner.backtrace()
33    }
34}
35
36impl std::fmt::Display for Error {
37    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
38        std::fmt::Display::fmt(&self.inner, f)
39    }
40}
41
42impl From<std::io::Error> for Error {
43    fn from(err: std::io::Error) -> Error {
44        Error { inner: Context::new(ErrorKind::Io(err)) }
45    }
46}
47
48impl From<std::num::ParseIntError> for Error {
49    fn from(err: std::num::ParseIntError) -> Error {
50        Error { inner: Context::new(ErrorKind::Parse(err)) }
51    }
52}
53
54type ParseResult<i32> = Result<i32, Error>;
55
56pub fn run(filename: Option<String>) -> ParseResult<i32> {
57    let mut file = File::open(filename.unwrap())?;
58
59    let mut contents = String::new();
60    file.read_to_string(&mut contents)?;
61    let mut sum = 0;
62    for c in contents.lines(){
63        let n: i32 = c.parse::<i32>()?;
64        sum += n;
65    }
66    Ok(sum)
67}