My Awesome Rust: anyhow

Page content

anyhow (https://github.com/dtolnay/anyhow) はRustのエラー処理を扱うライブラリです。 anyhowを使うことで、Go言語にあるエラーのラップを行えるようになります。

使い方

anyhowはCargo.tomlに依存として追加することで使えるようになります。

[dependencies]
anyhow = { version = "1", features = ["backtrace"] }

エラーをラップするには以下のようにContextというトレイトに生えているメソッドを使います。 contextを使うよりもwith_contextを使う方が好ましいです。with_contextを使えば、エラー発生時のみ引数が評価されるので、format!などでエラーメッセージを作るときに不要な評価をなくすことができます。

use anyhow::Context as _;
use std::fs::File;

fn main() -> anyhow::Result<()> {
    
    let f = File::create("/tmp/test").context("fail to open file")?;
    let f = File::create("/tmp/test").with_context(|| "fail to open file")?;
    
    Ok(())
}

backtraceを有効にすると、エラーのデバッグフォーマットにbacktraceが表示されてデバッグしやすくなります。

Error: Failed to read instrs from ./path/to/instrs.json

Caused by:
    No such file or directory (os error 2)

Stack backtrace:
   0: <E as anyhow::context::ext::StdError>::ext_context
             at /git/anyhow/src/backtrace.rs:26
   1: core::result::Result<T,E>::map_err
             at /git/rustc/src/libcore/result.rs:596
   2: anyhow::context::<impl anyhow::Context<T,E> for core::result::Result<T,E>>::with_context
             at /git/anyhow/src/context.rs:58
   3: testing::main
             at src/main.rs:5
   4: std::rt::lang_start
             at /git/rustc/src/libstd/rt.rs:61
   5: main
   6: __libc_start_main
   7: _start