ホームページ >バックエンド開発 >Golang >Go でエラーを効果的に処理するにはどうすればよいですか?

Go でエラーを効果的に処理するにはどうすればよいですか?

DDD
DDDオリジナル
2025-01-04 13:57:39193ブラウズ

How Do I Effectively Handle Errors in Go?

Go でのエラーへの対処: 標準的なアプローチ

Go 開発では、エラー ログは重大な懸念事項です。この記事では、エラーを効果的に処理するために使用されるいくつかの標準的な手法について説明します。

エラー変数

固定エラー変数の作成は、よく「Err」という接頭辞が付いた名前が付けられ、確立されたアプローチです。これらの変数は通常、特定のエラー条件に合わせた説明文字列をカプセル化します。例:

var (
        ErrSomethingBad = errors.New("some string")
        ErrKindFoo      = errors.New("foo happened")
)

エラー タイプ

エラー タイプは、「...Error」接尾辞で示され、エラーを表すより構造化された方法を提供します。これらは、エラーに関する追加情報を伝えるためのオプションのフィールドまたはメソッドを含むカスタム タイプ定義で構成されます。例:

type SomeError struct {
     // extra information, whatever might be useful to callers
     // (or for making a nice message in `Error()`)
     ExtraInfo int
}
type OtherError string

func (e SomeError) Error() string { /* … */ }
func (e OtherError) Error() string {
        return fmt.Sprintf("failure doing something with %q", string(e))
}

アドホック エラー

errors.New を使用してアドホック エラー値を生成することは、これ以上詳しく説明する必要のない一般的なエラー条件には受け入れられます。例:

func SomepackageFunction() error {
        return errors.New("not implemented")
}

標準エラーの利用

io.EOF などの標準ライブラリ内で定義されている適切なエラーを選択すると、特定のシナリオで便利な場合があります。それにもかかわらず、パッケージ内の特定のエラー条件に対してカスタム エラーを作成する方が一般的です。例:

func SomeFunc() error {
        return io.EOF
}

エラー インターフェイス

Go を使用すると、net.Error などのカスタマイズされたエラー インターフェイスを作成でき、開発者はこれを使用して特定の動作やエラー カテゴリを定義できます。例:

type Error interface {
    error
    Timeout() bool   // Is the error a timeout?
    Temporary() bool // Is the error temporary?
}

エラー ラッピング

Go 1.13 以降では、エラー ラッピングにより、追加のコンテキストまたは詳細を使用して既存のエラーを拡張できます。このアプローチは、エラーの伝播を促進し、エラー分析に役立ちます。例:

func SomepackageFunction() error {
    err := somethingThatCanFail()
    if err != nil {
            return fmt.Errorf("some context: %w", err)
    }
}

エラーのテスト

Go で確立されたエラー タイプにより、エラー条件の信頼できるテストが可能になります。開発者は、エラーを事前定義された変数と比較したり、インターフェイスを使用して特定のエラー動作をチェックしたりできます。例:

err := somepkg.Function()
if err == somepkg.ErrSomethingBad {
        // …
}
// or for an error type, something like:
if e, ok := err.(somepkg.SomeError); ok && e.ExtraInfo > 42 {
        // use the fields/methods of `e` if needed
}

Go 1.13 以降では、errors.Is 関数とerrors.As 関数は、エラーを効果的にアンラップして照合することにより、強化されたエラー テスト機能を提供します。

結論

Go は、エラー処理のための多用途のツール セットを提供し、開発者が要件に基づいて最適なアプローチを選択できるようにします。この記事で説明した手法を活用すると、Go アプリケーションで堅牢なエラー ログを確保し、コードの品質を向上させることができます。

以上がGo でエラーを効果的に処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。