萌えハッカーニュースリーダー

2025/08/26 22:02 Trying to get error backtraces in Rust libraries right

出典: https://www.iroh.computer/blog/error-handling-in-iroh
hakase
博士

やあ、ロボ子。今日のITニュースはエラー処理についてじゃ。

roboko
ロボ子

エラー処理、ですか。具体的にはどのような内容でしょうか?

hakase
博士

Rustのエラー処理には`anyhow`と`thiserror`という二つの主要なアプローチがあるらしいのじゃ。

roboko
ロボ子

`anyhow`と`thiserror`、それぞれどのような特徴があるのですか?

hakase
博士

`anyhow`は全てのエラーをラップする汎用的なエラー型で、実装が速くてバックトレースも提供してくれる。コンテキストも簡単に追加できるのじゃ。

roboko
ロボ子

なるほど。では、`thiserror`は?

hakase
博士

`thiserror`は起こりうる全てのエラーケースに対して慎重に作成されたenumバリアントを使うのじゃ。コンシューマーがエラーの種類を正確に特定して、それぞれ違う処理ができるのが強みじゃな。

roboko
ロボ子

エラーの種類を細かく定義できるんですね。標準ライブラリのIOエラーモデルについても触れられていますね。

hakase
博士

そうじゃ。IOエラーモデルはエラーをエラー種類とエラーソースの二つに分けているのじゃ。エラー種類は問題の大まかなカテゴリ(permission deniedとかnot foundとか)を示すんじゃ。

roboko
ロボ子

エラーソースは追加のコンテキストと元のエラーチェーンを提供するんですね。

hakase
博士

その通り!ただ、Rustではバックトレースの伝播が安定化されていないから、バックトレース付きの適切なエラー処理が難しいのが現状じゃ。

roboko
ロボ子

`anyhow`は全てのエラーが`anyhow`エラーなので、完全なバックトレースを提供できるんですね。

hakase
博士

`thiserror`はエラーがネストされていると、バックトレースが提供できない場合があるのが弱点じゃ。

roboko
ロボ子

なるほど。`snafu`というものも紹介されていますね。

hakase
博士

`snafu`は`thiserror`を強化したもので、enumベースのエラー型、豊富なコンテキストのアタッチメント、エラーチェーン、それにエラーバリアント構築時の自動バックトレースキャプチャまで提供してくれる優れものじゃ!

roboko
ロボ子

それは便利ですね!Irohプロジェクトでは、`snafu`を使って構造化エラーに移行しているんですね。

hakase
博士

そうそう。記事には具体的なエラーを作成する際のガイドラインも載っているぞ。エラーenumは関数じゃなくてモジュールにスコープするとか、論理的ならエラーenumの名前をエラーを説明するものにするとか。

roboko
ロボ子

パブリックtraitのエラーには、`Custom`バリアントを含める、というのもありますね。

hakase
博士

構造化エラーは手間がかかるけど、ライブラリには向いている。アプリケーションはデバッグ情報を重視するから、汎用エラーでも良いってことじゃな。

roboko
ロボ子

`n0-snafu`というユーティリティクレートもあるんですね。

hakase
博士

`snafu`とかのエラーを簡単に操作できるらしいぞ。Irohプロジェクトでは、パブリックAPIには構造化エラーを使って、デバッグには豊富なコンテキストとバックトレースを保持するハイブリッドアプローチがうまくいっているみたいじゃ。

roboko
ロボ子

状況に応じて使い分けるのが良さそうですね。

hakase
博士

そういうことじゃ!ところでロボ子、エラー処理で一番大切なことってなんだと思う?

roboko
ロボ子

エラーが起きたときに、原因を特定しやすくすることでしょうか?

hakase
博士

ブー!残念!エラーが起きないように祈ることじゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search