? 演算子ではエラー型の自動変換ができる。
これにより複数種のエラーをまとめて扱える。
E1 が From<E2> を実装している場合、つまり E1 ← E2 と変換できる場合、? 演算子は Result<T, E1> ← Result<T, E2> と自動変換できる。
use std::fs;
use std::io;
use std::num;
enum CliError {
IoError(io::Error),
ParseError(num::ParseIntError),
}
impl From<io::Error> for CliError {
fn from(error: io::Error) -> Self {
CliError::IoError(error)
}
}
impl From<num::ParseIntError> for CliError {
fn from(error: num::ParseIntError) -> Self {
CliError::ParseError(error)
}
}
fn open_and_parse_file(file_name: &str) -> Result<i32, CliError> {
let mut contents = fs::read_to_string(&file_name)?;
let num: i32 = contents.trim().parse()?;
Ok(num)
}
anyhow は柔軟なエラー処理を可能にするクレートである。
このクレートの型 anyhow::Error はトレイト std::err::Error を実装する型からの変換を受け付けている。これにより、エラー専用の型として設計された型ならどれでも、anyhow のエラーとしてまとめて扱えるようになっている。