0Pricing
Learn Rust Coding · レッスン

anyhow

柔軟なアプリケーションエラー

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

柔軟なアプリケーションエラー

アプリケーションコードでは、エラーごとに型付き enum を定義せず、コンテキストを付けてエラーを上位へ伝播したいことがよくあります。anyhow クレートは、そのための簡単な単一エラー型を提供します。

anyhow の追加

依存関係として追加します。thiserror と相性がよく、ライブラリには thiserror、バイナリには anyhow を使います。

[dependencies]
anyhow = "1.0"

anyhow::Result エイリアス

anyhow::Result<T> は Result<T, anyhow::Error> の短縮形です。Error 型には、std::error::Error を実装する任意のエラーを格納できます。

use anyhow::Result;

fn load() -> Result<String> {
    let text = std::fs::read_to_string("config.txt")?;
    Ok(text)
}

自動変換

? 演算子は標準エラーを自動的に anyhow::Error へ変換するため、異なるエラー型を自由に組み合わせられます。

use anyhow::Result;

fn parse_file(path: &str) -> Result<i32> {
    let text = std::fs::read_to_string(path)?; // io error
    let n: i32 = text.trim().parse()?;          // parse error
    Ok(n)
}

コンテキストの追加

.context() メソッドはエラーに人間が読みやすいメッセージを付加し、失敗時に理解しやすいチェーンを構築します。

use anyhow::{Context, Result};

fn read_config(path: &str) -> Result<String> {
    let text = std::fs::read_to_string(path)
        .context("failed to read config file")?;
    Ok(text)
}

遅延コンテキスト

メッセージの構築にコストがかかる場合や実行時のデータが必要な場合は with_context を使用します。クロージャはエラーが発生した場合にのみ実行されます。

use anyhow::{Context, Result};

fn open(path: &str) -> Result<String> {
    std::fs::read_to_string(path)
        .with_context(|| format!("could not open {path}"))
}

アドホックエラーの作成

anyhow! マクロはメッセージからエラーを作成し、bail! はエラーを返して早期終了します。

use anyhow::{anyhow, bail, Result};

fn check(age: i32) -> Result<()> {
    if age < 0 {
        bail!("age cannot be negative");
    }
    if age > 150 {
        return Err(anyhow!("age {age} is implausible"));
    }
    Ok(())
}

ensure! の使用

ensure! は assert! に似ていますが、パニックを起こす代わりにエラーを返します。

use anyhow::{ensure, Result};

fn divide(a: i32, b: i32) -> Result<i32> {
    ensure!(b != 0, "division by zero");
    Ok(a / b)
}

main での anyhow

main から anyhow::Result<()> を返すと、失敗時に整形されたエラーチェーンが表示されます。

use anyhow::Result;

fn main() -> Result<()> {
    let text = std::fs::read_to_string("data.txt")?;
    println!("{text}");
    Ok(())
}

原因の調査

anyhow::Error は不透明ですが、内容を調べることはできます。分岐処理が必要な場合は、downcast_ref で具体的なエラー型を復元できます。

use anyhow::Result;

fn report(err: anyhow::Error) {
    if let Some(io) = err.downcast_ref::<std::io::Error>() {
        println!("io error: {io}");
    } else {
        println!("other error: {err}");
    }
}

thiserror と anyhow

基本的な使い分けは次のとおりです。

  • thiserror — ライブラリ、呼び出し側が match する型付きエラー
  • anyhow — アプリケーション、コンテキストを付けてそのまま伝播

thiserror のエラーは ? で anyhow にシームレスに変換できます。

理解度チェック

エラーの伝播時に説明的なメッセージを付加する anyhow のメソッドはどれですか?

まとめ

anyhow クレートについて学びました。

  • anyhow::Result<T> は柔軟な単一エラー型を使用します
  • ? は標準エラーを自動的に変換します
  • .context() / with_context() は読みやすいメッセージを追加します
  • anyhow!、bail!、ensure! はエラーを作成します
  • アプリケーション(バイナリ)コードに最適です

よくある質問

「anyhow」レッスンは無料ですか?

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

「anyhow」で何を学びますか?

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

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

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

「anyhow」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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