GOでは、エラー処理は主にerror
タイプを使用して管理されます。これは、以下のようにbuiltin
パッケージで定義されているインターフェイスです。
<code class="go">type error interface { Error() string }</code>
このインターフェイスを実装する任意のタイプは、エラーと見なすことができます。 Goのエラー処理に対するアプローチは明示的であり、開発者が発生した直後にエラーを確認および処理することを奨励しています。 GOの取り扱いエラーの一般的なパターンは、関数呼び出し後にエラー戻り値を確認し、エラーが発生したかどうかに基づいて何をすべきかを決定することです。これが簡単な例です:
<code class="go">result, err := someFunction() if err != nil { // Handle the error fmt.Println("An error occurred:", err) return } // Use result safely</code>
Goでは、関数は複数の値を返すことができ、最後の値としてエラーを返すことは慣習です。機能を作成するときは、常にどのエラーが発生するかを常に考慮し、適切に返す必要があります。例えば:
<code class="go">func divide(a, b int) (int, error) { if b == 0 { return 0, errors.New("division by zero") } return a / b, nil }</code>
divide
を呼び出すと、次のようなエラーを処理します。
<code class="go">quotient, err := divide(10, 2) if err != nil { log.Fatal(err) } fmt.Println(quotient) // Output: 5</code>
GOでの効果的なエラー処理には、コードが堅牢で保守可能であることを確認するためのいくつかのベストプラクティスが含まれます。
ラッピングを使用: 1.13導入されたエラーラッピングを行います。これにより、元のエラーを失うことなくエラーにコンテキストを追加できます。 %w
動詞を備えたfmt.Errorf
を使用して、エラーをラップします。
<code class="go">err := fmt.Errorf("failed to read file: %w", os.ErrNotExist)</code>
延期関数を使用します。延期関数を使用してリソースとクリーンアップを処理します。これは、特にrecover
時にエラー処理にも使用できます。
<code class="go">defer func() { if r := recover(); r != nil { fmt.Println("Recovered from panic:", r) } }()</code>
GOでカスタムエラータイプを作成することは、より詳細なエラー処理や、異なる種類のエラーを区別するのに役立ちます。カスタムエラータイプを定義する方法は次のとおりです。
エラータイプを定義します。 error
インターフェイスを実装する構造体を作成することにより、カスタムエラータイプを定義できます。
<code class="go">type MyError struct { Code int Message string } func (e *MyError) Error() string { return fmt.Sprintf("Error %d: %s", e.Code, e.Message) }</code>
カスタムエラーを使用します。定義されたら、関数でカスタムエラータイプを使用できます。
<code class="go">func doSomething() error { // Some operation fails return &MyError{Code: 404, Message: "Resource not found"} }</code>
カスタムエラータイプを確認します。タイプアサーションを使用してカスタムエラータイプを確認できます。
<code class="go">err := doSomething() if err != nil { if e, ok := err.(*MyError); ok { fmt.Printf("Custom error: Code %d, Message %s\n", e.Code, e.Message) } else { fmt.Println("Unknown error:", err) } }</code>
エラーラッピング: fmt.Errorf
と%w
を使用して、追加のコンテキストでカスタムエラーをラップすることもできます。
<code class="go">err := doSomething() if err != nil { return fmt.Errorf("operation failed: %w", err) }</code>
いくつかのツールとライブラリは、GOのエラー処理を改善するのに役立ちます。
PKG/エラー: github.com/pkg/errors
パッケージは、スタックトレースなどの追加のエラー処理機能を提供します。これは、デバッグに非常に役立ちます。また、エラーラッピングもサポートし、後に標準ライブラリに組み込まれました。
<code class="go">err := errors.New("original error") wrappedErr := errors.Wrap(err, "additional context")</code>
Uber-go/zap:このロギングライブラリは、構造化された高速でレベルの付いたロギングを提供します。追加のコンテキストを備えたロギングエラーに特に役立ちます。
<code class="go">logger := zap.NewExample() defer logger.Sync() sugar := logger.Sugar() sugar.Infow("Failed to fetch URL.", "url", url, "attempt", 3, "backoff", time.Second, )</code>
Go-chi/chi: Webサービスを構築している場合、 github.com/go-chi/chi
go-chi/chiルーターには、標準化された方法でエラーを処理およびロギングするためのミドルウェアが組み込まれています。
<code class="go">r := chi.NewRouter() r.Use(middleware.Recoverer) r.Get("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("hello world")) })</code>
errgroup: golang.org/x/sync/errgroup
パッケージから、 errgroup.Group
、ゴルチンとそのエラーの管理を一元化して管理するのに役立ちます。
<code class="go">g := new(errgroup.Group) g.Go(func() error { // do something return nil }) if err := g.Wait(); err != nil { log.Fatal(err) }</code>
github.com/hashicorp/go-multierror:このパッケージを使用すると、複数のエラーを単一のエラーに組み合わせることができます。これは、故障する可能性のある複数の操作を処理する場合に役立ちます。
<code class="go">var errs error errs = multierror.Append(errs, errors.New("first error")) errs = multierror.Append(errs, errors.New("second error")) if errs != nil { log.Fatal(errs) }</code>
これらのツールとライブラリを使用すると、GOのエラー処理戦略を大幅に強化することができ、アプリケーションがより堅牢でデバッグとメンテナンスを容易にします。
以上がGOのエラーをどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。