Rustエラーハンドリング実践ガイド|thiserror・anyhow・Result型の使い分け

Rustには例外(exception)がありません。Java、Python、JavaScriptといった多くの言語が try-catch でエラーを処理するのに対し、Rustは Result<T, E> 型と Option<T> 型でエラーを「値」として扱います。 この設計により、関数の戻り値にエラーの可能性が型として表現され、コンパイル時にエラー処理の漏れを検出できます。本記事では、Result の基礎から thiserror と anyhow の実践的な使い分けまでを順を追って解説します。 Result型とOption型の基本 Result<T, E> は成功値 T またはエラー値 E を持つ列挙型、Option<T> は値の有無を表す列挙型です。 use std::fs; fn main() { // Result: エラーの可能性がある処理 match fs::read_to_string("config.toml") { Ok(content) => println!("内容: {}", content), Err(e) => eprintln!("読み込み失敗: {}", e), } // Option: 値が存在しない可能性がある処理 let v = vec![1, 2, 3]; match v.get(5) { Some(val) => println!("値: {}", val), None => println!("インデックス範囲外"), } } unwrapとexpectの使い分け メソッド パニック時の挙動 用途 unwrap() 汎用メッセージで強制終了 プロトタイピング、テスト expect("msg") 指定メッセージで強制終了 論理的に失敗しない場面 match / if let パニックしない プロダクションコード unwrap() はプロトタイピングでは便利ですが、プロダクションコードでは原則として使うべきではありません。 ...

2026年2月8日 · 3 分 · 7259 文字 · uiuifree