まとめ
3つのレッスンを通してhooqの基本的な使い方を紹介してきました。
レッスンでは触れられなかった細かい仕組みや仕様がまだまだあるので、気になった機能の紹介はぜひ個別のドキュメントを参照いただきたいです。
他手段との比較
すべての関数に #[hooq] (や #[hooq(anyhow)] ) マクロを付与すると、エラーのスタックトレースに近いものを得られることを本チュートリアルで紹介しました!
本節ではおまけとして、スタックトレース(に近いもの)を得る他の手段との比較表を以下に示します。
凡例:
- 🌈: とても良い
- ✅: 良い
- ⚠️: あまり良くない
- ❌: 良くない
比較表解説:
- 学習コスト・自由度
- ⚠️
BacktraceはRUST_LIB_BACKTRACE=1環境変数の定義が必要な上、OSスレッドに依存するため利用にはRustの制御フローとは別の知識が求められます。 - ⚠️
tracingはスタックトレースの取得を目的とした場合は過剰です。とはいえ、慣れていれば程よい選択肢と言えます。 - 🌈
hooqは関数の頭にマクロを付けるだけです!
- ⚠️
- 型定義の容易さ:
- ⚠️
Backtraceをthiserrorと併用する場合、予めエラー型のフィールドに含める必要があります。エラーを細分化しているほど後付けが大変になるか、あるいはエラー型の表現がシンプルではなくなるでしょう。 - ✅
tracingには特に制約がないです。 - ✅
hooqも、任意のエラーハンドリングクレートと相性が良いです!
- ⚠️
- マクロレス:
- 🌈
Backtraceはマクロを利用しなくて良いのが利点です! - ❌
tracingで手軽にスタックトレース相当の情報を得るには、#[tracing::instrument(err)]等がほぼ必須です。 - ❌
hooqは属性マクロクレートなので、マクロを使いたくない場合には利用できません。
- 🌈
- 情報量制御:
- ⚠️
Backtraceが出力する通常のバックトレースは情報量が多すぎます😵- 生のバックトレースは、非同期の場合全く役に立ちませんし、多くの場合では過剰でしょう。
- ただし、
color-eyreクレートを利用することで改善され、実用的になり得ます。
- ✅
tracingは非同期の場合でも関数をたどることができます。一方、「何行目の?演算子か?」といった詳細な情報を得るには手動でロギングを入れるしかありません。 - 🌈
hooqは (#[tracing::instrument]と同様に)#[hooq]を付けた関数についてのみトレースされるのでほしい箇所だけ的確に得られます。その上、?演算子やreturnの位置まで取得でき、より細かい情報を得られます!- 属性マクロなので、test時や特定のfeatureが有効な時だけ
#[cfg_attr(..., hooq(...))]で条件付き付与、といったことが可能です! - 💡
tracingと併用が可能なので、tracingの情報取得粒度を増やす使い方もできます!詳しくはフレーバーの tracing を見てください
- 属性マクロなので、test時や特定のfeatureが有効な時だけ
- ⚠️
- プラットフォームサポート:
- ⚠️
Backtraceはプラットフォームによっては利用不可であることが公式ドキュメントに記述されています。 - ✅ 通常のログ収集用途であればプラットフォームによる制約はないでしょう。
- 🌈
?にメソッドを挿入するだけなので、プラットフォーム依存の機能に頼ることはありません。各プラットフォームで工夫した使い方が可能です。- 💡
#[hooq::method(.unwrap()!)]で、?をunwrapのエイリアスとして利用する方法などもあります!
- 💡
- ⚠️