thiserror
カスタムエラー型
「thiserror」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全4レッスンが含まれています。
カスタムエラーが必要な理由
ライブラリは、呼び出し側が特定の失敗に対応できるよう、意味のあるエラー型を公開する必要があります。これを手作業で記述すると、多くの定型コードが必要になります。thiserror クレートを使えば、そのコードを自動生成できます。
thiserror の追加
依存関係として追加します。derive マクロを提供するクレートで、実行時のコストはゼロです。
[dependencies]
thiserror = "1.0"エ列挙型でのエラー定義
各バリアントが異なる失敗を表す enum に Error を derive します。#[error("...")] 属性で Display メッセージを指定します。
use thiserror::Error;
#[derive(Error, Debug)]
pub enum DataError {
#[error("item not found")]
NotFound,
#[error("invalid input: {0}")]
Invalid(String),
}フィールドの埋め込み
メッセージ文字列では名前付きフィールドや位置フィールドを参照できるため、エラーにコンテキストを含められます。
use thiserror::Error;
#[derive(Error, Debug)]
pub enum ConfigError {
#[error("missing key: {key}")]
Missing { key: String },
#[error("value {0} out of range")]
OutOfRange(i32),
}Display と Error の自動実装
derive によって、Display(指定したメッセージから)と std::error::Error の両方が自動的に実装されます。手動で impl ブロックを書く必要はありません。
元のエラーのラップ
#[from] は From impl を生成するため、? 演算子で元のエラーを自分の型に変換できます。#[source] は原因となるエラーを示します。
use thiserror::Error;
#[derive(Error, Debug)]
pub enum AppError {
#[error("io failure")]
Io(#[from] std::io::Error),
#[error("parse failure")]
Parse(#[from] std::num::ParseIntError),
}? の使用
#[from] のおかげで、? 演算子は標準エラーを自動的に AppError へ変換します。
fn read_number(path: &str) -> Result<i32, AppError> {
let text = std::fs::read_to_string(path)?; // io::Error -> AppError
let n: i32 = text.trim().parse()?; // ParseIntError -> AppError
Ok(n)
}source チェーン
エラーをラップすると、thiserror は Error::source を通じて原因を公開します。これにより、ログ出力やデバッグに役立つ完全なエラーチェーンを利用できます。
transparent エラー
#[error(transparent)] は Display と source の両方をラップしたエラーに委譲します。処理をそのまま通過させるバリアントに便利です。
use thiserror::Error;
#[derive(Error, Debug)]
pub enum WrapError {
#[error(transparent)]
Other(#[from] std::io::Error),
}thiserror を使う場面
次のような場合は thiserror を使用してください。
- ライブラリを作成している
- 呼び出し側が特定のエラーバリアントを match する必要がある
- 安定した型付きエラー API を提供したい
エラーをそのまま上位へ伝播したいだけのアプリケーションでは、anyhow のほうが簡単なことが多いです。
バリアントとのマッチング
エラーは実際の enum なので、呼び出し側は match で各種の失敗に異なる対応を行えます。
fn handle(err: AppError) {
match err {
AppError::Io(_) => println!("retry the file operation"),
AppError::Parse(_) => println!("ask the user to fix input"),
}
}理解度チェック
thiserror の enum で #[from] 属性は何を生成しますか?
まとめ
thiserror クレートについて学びました。
#[derive(Error)]は Display と Error の impl を生成します#[error("...")]はフィールドを埋め込んだメッセージを定義します#[from]により、元のエラーから?で変換できますtransparentはラップしたエラーに委譲します- 型付きのライブラリエラー API に適しています
よくある質問
「thiserror」レッスンは無料ですか?
はい。「thiserror」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn Rust Codingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn Rust Codingコースには全4レッスンが含まれています。
「thiserror」で何を学びますか?
カスタムエラー型 ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Learn Rust Codingを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLearn Rust Codingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「thiserror」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn Rust Codingレッスンでコードを書いて実行できますか?
はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Resultと?演算子
- thiserror
- anyhow
- エラー変換