0Pricing
Learn Rust Coding · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Resultと?演算子
  2. thiserror
  3. anyhow
  4. エラー変換
← Learn Rust Codingに戻る