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