【Rust】第4章第4回:Option型とResult型:エラーハンドリングの基本

本記事では、Rustのエラーハンドリングの基本となるOption
型とResult
型の使い方について解説します。Rustは例外処理を採用しておらず、これらの型を活用することで安全なエラーハンドリングを実現できます。
0. 記事の概要
この記事を読むメリット
- Rustのエラーハンドリングの基礎を理解: 安全なコードを記述するための必須知識です。
- パニックを防ぐ: 例外ではなく、型システムを活用したエラーハンドリングを学べます。
- 安全で効率的なプログラム設計: 予期しないエラーを適切に処理できます。
この記事で学べること
- Option型とResult型の基本構文
- エラーハンドリングの実践例
- よくあるエラーと対処法
1. Option型とは?

1.1 Option型の基本
Option
型は、「値がある」または「値がない」を表現するための型です。
fn find_number(n: i32) -> Option {
if n > 0 {
Some(n * 2)
} else {
None
}
}
fn main() {
let result = find_number(10);
match result {
Some(value) => println!("値: {}", value),
None => println!("値が見つかりませんでした"),
}
}
動作解説
関数find_number
は、正の数が渡された場合にその2倍を返し、負の数ならNone
を返します。
2. Result型とは?

2.1 Result型の基本
Result
型は、「成功」と「エラー」の両方を表現できる型です。
fn divide(a: i32, b: i32) -> Result {
if b == 0 {
Err(String::from("ゼロで割ることはできません"))
} else {
Ok(a / b)
}
}
fn main() {
let result = divide(10, 2);
match result {
Ok(value) => println!("結果: {}", value),
Err(msg) => println!("エラー: {}", msg),
}
}
動作解説
divide
関数は、割り算の結果をOk
として返し、ゼロ除算の場合はエラーメッセージをErr
として返します。
3. エラー処理の便利な書き方

3.1 unwrap() と expect() の使用
unwrap()
とexpect()
を使うと、エラー処理を簡単に記述できますが、使用には注意が必要です。
fn main() {
let num = Some(42);
println!("値: {}", num.unwrap());
let none_val: Option = None;
println!("値: {}", none_val.expect("値が必要です"));
}
動作解説
unwrap()
はNone
のときにパニックを引き起こします。expect()
はエラーメッセージを指定できるため、デバッグに便利です。
4. よくあるエラーと対処法
- 「called unwrap on a None value」エラー:
unwrap()
を使ってNone
を取得しようとすると発生。 - 「mismatched types」エラー:
Result
型の返り値を適切に処理しないと発生。
5. まとめ
本記事では、RustのOption
型とResult
型を用いたエラーハンドリングの基本を学びました。次回は、構造体と列挙型を組み合わせた実践的な活用例について解説します。