🦀

Rustでの基本的なエラーハンドリング

2023/08/10に公開

Rustエラーハンドリング入門

この記事では、Rustのエラーハンドリングにおける5つの主要なメソッドについて解説しています。

概要

Rustプログラミング言語は、強力なエラーハンドリングの仕組みを持っています。エラーハンドリングはプログラムの安全性と堅牢性を高め、デバッグを容易にする重要な部分です。この記事では、Rustのエラーハンドリングの基本である5つの主要なメソッドを初心者向けに解説します。それぞれのメソッドの使い方と特性を理解することで、より効果的なコードを書くための基礎を身に付けることができます。

https://zenn.dev/keisuke333/articles/706e51194ca54c

目次

unwrap

unwrapは、ResultまたはOptionOkまたはSomeであれば値を返し、そうでなければパニックします。

let some_value: Option<i32> = Some(42);
let unwrap_value = some_value.unwrap(); // 42
let none_value: Option<i32> = None;
let panic_none_value = none_value.unwrap(); // panic!

expect

expectunwrapと同じように動作しますが、エラーメッセージをカスタマイズできます。

let some_value: Option<i32> = Some(42);
let expect_some_value = some_value.expect("Failed to find a value"); // 42
let none_value: Option<i32> = None;
let panic_none_value = none_value.expect("Failed to find a value"); // panic! エラーメッセージ: "Failed to find a value"

?

?演算子は、ResultErrの場合に早期リターンします。関数の戻り値がResultである必要があります。

fn get_value() -> Result<i32, &'static str> {
    let value: Result<i32, &'static str> = Err("An error occurred");
    let unwrapped = value?; // 早期リターン
    Ok(unwrapped)
}

unwrap_or

unwrap_orは、ResultまたはOptionOkまたはSomeであれば値を返し、そうでなければデフォルト値を返します。

let some_value: Option<i32> = Some(42);
let unwrapped_or_default_some = some_value.unwrap_or(0); // 42
let none_value: Option<i32> = None;
let unwrapped_or_default_none = none_value.unwrap_or(0); // 0

unwrap_or_else

unwrap_or_elseは、unwrap_orに似ていますが、クロージャを使用してデフォルト値を計算します。エラーが発生した場合に、このクロージャが呼び出され、クロージャの戻り値が最終的な結果として返されます。

let value: Result<i32, &str> = Err("An error occurred");
let unwrapped_or_else = value.unwrap_or_else(|err| {
    println!("Error: {}", err);
    0
}); // Error: An error occurred, 0

まとめ

  • unwrap
    成功した場合の値を返し、失敗した場合はパニック。
  • expect
    unwrapと同じ動作だが、失敗時のエラーメッセージをカスタマイズ。
  • ?
    成功した場合は値を返し、失敗した場合は関数から早期リターン。
  • unwrap_or
    成功した場合の値を返し、失敗した場合はデフォルト値を返す。
  • unwrap_or_else
    unwrap_orと同じ動作だが、失敗時にクロージャを使用してデフォルト値を計算。

これらのメソッドは、エラーハンドリングの方法やシチュエーションに応じて選択できる選択肢を提供します。Rust初心者のうちにこれらのメソッドを理解し適切に使用することが重要になるかと思います。

Discussion