#11 Rustで学ぶエラーハンドリングの基本
Rustのエラーハンドリングは、他の言語のような「例外」という仕組みを持たず、Resultという型を使った独自の考え方が中心になります。この記事では、Rustにおけるエラーハンドリングの基本を解説します。
Result型という考え方
失敗する可能性がある処理は、Resultという「成功か失敗かを表す型」を返します。
fn divide(a: i32, b: i32) -> Result {
if b == 0 {
return Err(String::from("0では割れません"));
}
Ok(a / b)
}
成功時はOk、失敗時はErrという形で結果を包んで返します。
matchで結果を扱う
match divide(10, 0) {
Ok(result) => println!("結果: {}", result),
Err(message) => println!("エラー: {}", message),
}
unwrap_orで既定値を使う
エラー時に既定値を使いたいだけの単純な場合は、unwrap_orを使うとmatchを書かずに済みます。
let result = divide(10, 0).unwrap_or(0);
println!("{}", result); // 0
?という便利な記号
Rustには、Resultがエラーだった場合に、その場で関数の呼び出し元にエラーを伝えて処理を中断できる?という記号があります。
fn calculate() -> Result {
let result = divide(10, 0)?;
Ok(result)
}
?を使わない場合は毎回matchでエラーを確認して伝播させる必要がありますが、?を使えば1文字でその処理を表現できます。
panic!という最終手段
Rustには、プログラムを強制的に停止させるpanic!というマクロもありますが、これは回復不可能な致命的な問題が起きたときの最終手段として位置づけられています。通常のエラー処理にはResultを使うのがRustらしい設計です。
Rustならではの注意点
他の言語の「エラーが起きても気づかずに進んでしまう」という問題を防ぐため、RustはResultの中身を確認しない限り、警告を出す仕組みになっています。エラーの可能性を無視できない設計こそが、Rustの安全性を支えています。
まとめ
RustのエラーハンドリングはResult型が中心で、matchや?を使って結果を扱います。unwrap_orによる既定値の指定も含め、エラーの可能性を無視できない設計に慣れていきましょう。
本ページはプロモーションを含みます。
参考書籍(PR)
Rustをもっと学びたい方には「実践Rust入門[言語仕様から開発手法まで]」がおすすめです。
PR
コードを書かずに自動化したい方へ
「学んだけど自分の作業に組み込む時間がない」という方向けに、ダブルクリックで動く Windows専用の自動化ツールをオーダーメイドで作成しています。気になる方は こちらをご覧ください。
コメント
コメントを投稿