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
プログラマーこまつ