Skip to content

Latest commit

 

History

History
60 lines (47 loc) · 2.19 KB

retain.zh.md

File metadata and controls

60 lines (47 loc) · 2.19 KB

避免在错误转换期间,丢掉了错误

[![error-chain-badge]][error-chain] [![cat-rust-patterns-badge]][cat-rust-patterns]

这个[error-chain]箱子,能匹配函数返回的不同错误类型,可能是相对紧凑的。ErrorKind能确定错误类型。

使用[reqwest]查询一个随机整数生成器的 Web 服务。将响应的字符串,转换为整数。我们有 Rust 标准库,[reqwest],并且 Web 服务的全部错误都会(可能)发生。要明确定义的 Rust 错误,请使用foreign_links。 对于额外的 Web 服务错误ErrorKind变种,使用error_chain!宏的errors代码块。

#[macro_use]
extern crate error_chain;
extern crate reqwest;

use std::io::Read;

error_chain! {
    foreign_links {
        Io(std::io::Error);
        Reqwest(reqwest::Error);
        ParseIntError(std::num::ParseIntError);
    }

    errors { RandomResponseError(t: String) }
}

fn parse_response(mut response: reqwest::Response) -> Result<u32> {
    let mut body = String::new();
    response.read_to_string(&mut body)?;
    body.pop();
    body.parse::<u32>()
        .chain_err(|| ErrorKind::RandomResponseError(body))
}

fn run() -> Result<()> {
    let url =
        format!("https://www.random.org/integers/?num=1&min=0&max=10&col=1&base=10&format=plain");
    let response = reqwest::get(&url)?;
    let random_value: u32 = parse_response(response)?;

    println!("a random number between 0 and 10: {}", random_value);

    Ok(())
}

fn main() {
    if let Err(error) = run() {
        match *error.kind() {
            ErrorKind::Io(_) => println!("Standard IO error: {:?}", error),
            ErrorKind::Reqwest(_) => println!("Reqwest error: {:?}", error),
            ErrorKind::ParseIntError(_) => println!("Standard parse int error: {:?}", error),
            ErrorKind::RandomResponseError(_) => println!("User defined error: {:?}", error),
            _ => println!("Other error: {:?}", error),
        }
    }
}