エラー変換
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つの型へ変換します。
アプローチの選択
変換方法のまとめ:
- 手動の
Fromimpl — 完全に制御できますが、コードが増えます thiserror #[from]— 型付きエラーと自動生成された implBox<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フィードバックを取得できます。ローカル設定は不要です。