0Pricing
Learn Rust Coding · レッスン

エラー変換

Fromの実装

「エラー変換」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全4レッスンが含まれています。

エラーを変換する理由

コードの各層は異なるエラー型を生成します。1つの関数でそれらを伝播するには、低レベルのエラーを統一された型に変換する必要があります。Rust では From トレイトを使ってこれを行います。

From トレイト

From<T> は、ある型から別の型を構築する方法を定義します。自分のエラー型に対して実装すると、元のエラーをその型に変換できます。

trait From<T> {
    fn from(value: T) -> Self;
}

? が From を使う仕組み

expr? と記述したとき、エラー型が関数の戻り値のエラー型と異なる場合、演算子は From::from を呼び出して変換します。これがシームレスな伝播を可能にする仕組みです。

統一されたエラー型

関数が返す可能性のある各種類のエラーを格納する enum を定義します。

#[derive(Debug)]
enum AppError {
    Io(std::io::Error),
    Parse(std::num::ParseIntError),
}

From の実装

各元エラーに対して From impl を記述し、対応するバリアントに変換できるようにします。

impl From<std::io::Error> for AppError {
    fn from(e: std::io::Error) -> Self {
        AppError::Io(e)
    }
}

impl From<std::num::ParseIntError> for AppError {
    fn from(e: std::num::ParseIntError) -> Self {
        AppError::Parse(e)
    }
}

自動的な伝播

これらの impl があれば、? は各エラーを自動的に AppError へ変換します。

fn read_count(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)
}

Into は From の対になるもの

From<A> for B を実装すると、A: Into<B> も自動的に利用できます。From の実装を優先すれば、into() も自動的に使えるようになります。

fn make() -> AppError {
    let e: std::io::Error = std::io::Error::other("boom");
    e.into() // uses From<io::Error> for AppError
}

トレイトオブジェクトのボックス化

手早く変換するには、Box<dyn Error> が任意のエラー型を受け入れます。標準ライブラリがそこへの包括的な From impl を提供しているためです。

use std::error::Error;

fn run() -> Result<(), Box<dyn Error>> {
    let n: i32 = "42".parse()?; // ParseIntError -> Box<dyn Error>
    println!("{n}");
    Ok(())
}

From を生成するクレート

各 From impl を手作業で書くのは面倒です。thiserror の #[from] 属性はそれらを生成し、anyhow はすべてを自動的に1つの型へ変換します。

アプローチの選択

変換方法のまとめ:

  • 手動の From impl — 完全に制御できますが、コードが増えます
  • thiserror #[from] — 型付きエラーと自動生成された impl
  • Box<dyn Error> または anyhow — 定型コードを最小限にできます

変換時のコンテキスト追加

From impl は単にラップするだけでなく、エラーに情報を追加することもできます。ここでは変換時に追加のコンテキストを付け、最終的なエラーをより分かりやすくしています。

impl From<std::num::ParseIntError> for AppError {
    fn from(e: std::num::ParseIntError) -> Self {
        // could log or annotate here before wrapping
        AppError::Parse(e)
    }
}

理解度チェック

? 演算子が、あるエラー型を別の型に変換する際に使うトレイトはどれですか?

まとめ

エラーの変換について学びました。

  • ? は From トレイトを介してエラーを変換します
  • エラー enum に対して From<Source> を実装します
  • From により Into と into() も自動的に使えます
  • Box<dyn Error> は任意のエラーを受け入れます
  • thiserror と anyhow は定型コードを自動化します

よくある質問

「エラー変換」レッスンは無料ですか?

はい。「エラー変換」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn Rust Codingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn Rust Codingコースには全4レッスンが含まれています。

「エラー変換」で何を学びますか?

Fromの実装 ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Learn Rust Codingを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLearn Rust Codingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「エラー変換」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLearn Rust Codingレッスンでコードを書いて実行できますか?

はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

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

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