問題一覧に戻る
中級エラー処理
問題57: カスタムエラー型
独自のエラー型を定義することで、アプリケーション固有のエラーを表現できます。Fromトレイトを実装すると、?演算子で自動変換されます。複数のエラー源を統一的に扱え、エラー処理がシンプルになります。enumで様々なエラーケースを分類し、適切な情報を保持できます。
// カスタムエラー型
#[derive(Debug)]
AppError {
NotFound,
InvalidInput(String),
ParseError(std::num::ParseIntError),
}
// エラー変換
impl From<std::num::ParseIntError> for AppError {
fn from(err: std::num::ParseIntError) -> Self {
AppError::(err)
}
}
fn get_value(input: &str) -> <i32, AppError> {
if input.is_empty() {
return (AppError::InvalidInput("Empty input".to_string()));
}
// 自動変換
let value = input.parse::<i32>()?;
if value < 0 {
Err(AppError::NotFound)
} else {
Ok(value)
}
}
fn main() {
let results = vec![
get_value("42"),
get_value(""),
get_value("abc"),
];
for result in results {
println!("{:?}", result);
}
}