問題一覧に戻る
中級エラー処理
問題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);
}
}