Rust

【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型を用いたエラーハンドリングの基本を学びました。次回は、構造体と列挙型を組み合わせた実践的な活用例について解説します。