[![error-chain-badge]][error-chain] [![cat-rust-patterns-badge]][cat-rust-patterns]
要处理尝试打开不存在的文件时,发生的错误。我们会用到[error-chain],这是一个大量样板代码的库,用来[处理 Rust 的错误]。
foreign_links
里面的Io(std::io::Error)
,允许从std::io::Error
到error_chain!
所定义类型的自动转换,这些类型会实现Error
trait。
下面的食谱是,在打开 unix 文件/proc/uptime
,然后分析内容得到第一个数字期间,告诉我们系统运行了多长时间。要返回 uptime,除非出现错误。
本书中的其他食谱,会隐藏[error-chain]样板文件,可以通过按钮(展开代码)来查看。
#[macro_use]
extern crate error_chain;
use std::fs::File;
use std::io::Read;
error_chain!{
foreign_links {
Io(std::io::Error);
ParseInt(::std::num::ParseIntError);
}
}
fn read_uptime() -> Result<u64> {
let mut uptime = String::new();
File::open("/proc/uptime")?.read_to_string(&mut uptime)?;
Ok(uptime
.split('.')
.next()
.ok_or("Cannot parse uptime data")?
.parse()?)
}
fn main() {
match read_uptime() {
Ok(uptime) => println!("uptime: {} seconds", uptime),
Err(err) => eprintln!("error: {}", err),
};
}