Goのエラーハンドリング: errors.New vs fmt.Errorf の違いとメリット・デメリット
Go言語でエラーハンドリングをする際、よく使用される2つの方法に errors.New
と fmt.Errorf
があります。それぞれの違い、メリット・デメリットについて詳しく解説します。
1. errors.New
の特徴
errors.New
は、Goの標準パッケージ errors
によって提供されるシンプルなエラー作成関数です。固定のエラーメッセージを生成するのに適しています。
使い方:
import "errors"
func example() error {
return errors.New("token error")
}
メリット:
- シンプルで軽量
簡単なエラーメッセージを作成するのに最適。 - 依存関係が少ない
追加のフォーマット処理が不要な場合に有効。 - 処理が高速
フォーマット解析などを行わないため、パフォーマンスが良い。
デメリット:
- コンテキスト情報を含めにくい
エラー発生場所や原因を伝えるのが難しい。 - エラーのラッピングができない
既存のエラーを保持しつつ、新たなメッセージを付加することができない。
2. fmt.Errorf
の特徴
fmt.Errorf
は、フォーマットされたエラーメッセージを作成できる関数です。特に、%w
プレースホルダーを使うことで、エラーのラッピング(チェーン化)が可能になります。
使い方:
import (
"fmt"
"errors"
)
func example() error {
err := errors.New("base error")
return fmt.Errorf("failed to create directory: %w", err)
}
メリット:
- エラーのラッピングが可能 (
%w
を使用)
もともとのエラーを保持し、コンテキストを追加できる。 - 詳細なエラーメッセージを提供
変数や関数の戻り値を含めて、より具体的なエラーを記述可能。 - 統一的なログ出力に便利
fmt
パッケージのフォーマット機能を活かして、整ったログメッセージを作成。
デメリット:
- パフォーマンスが若干低下
文字列フォーマット処理が必要なため、errors.New
に比べるとオーバーヘッドがある。 - 誤ったラッピングの可能性
%w
を忘れると、元のエラーを包み込まずに情報を失ってしまう。
3. errors.New
と fmt.Errorf
の使い分け
ケース | 推奨手法 |
---|---|
固定メッセージが欲しい場合 | errors.New |
エラーのラッピングが必要な場合 | fmt.Errorf |
エラーに追加情報を含めたい場合 | fmt.Errorf |
シンプルなエラー処理 | errors.New |
4. どちらを選ぶべきか?
-
シンプルなエラー を作成するなら、
errors.New
を使いましょう。
例: 固定メッセージのエラー ("invalid input"
など) -
既存エラーのラッピングや、詳細なコンテキストが必要な場合 は、
fmt.Errorf
が便利です。
例: ファイル操作、ネットワーク通信など、エラー発生の原因を詳しく知りたい場面。
5. まとめ
-
errors.New
- シンプルなエラー生成向け。
- 軽量で高速。
- 追加情報なしの静的エラーに最適。
-
fmt.Errorf
- コンテキスト付きエラー向け。
- フォーマット可能で、エラーのラッピングに適している。
- ロギングやデバッグ時に有用。
Goのエラーハンドリングでは、状況に応じて適切な方法を選択することが重要です。簡単なエラーなら errors.New
、複雑なエラー追跡には fmt.Errorf
を活用し、エラーハンドリングを適切に設計しましょう! 💡
登録日:
更新日:
by
プログラマーこまつ