ホームページ  >  記事  >  バックエンド開発  >  Go で Defer によって返されたエラーを適切に処理する方法は?

Go で Defer によって返されたエラーを適切に処理する方法は?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-07 19:02:02835ブラウズ

How to Properly Handle Errors Returned by Defer in Go?

エラー処理と延期

Go では、defer ステートメントは、周囲の関数が戻った後に関数またはクリーンアップ操作を実行するためによく使用されます。ただし、defer 関数がエラーを返した場合、defer によって返されたエラーを無視するという一般的な慣行によりエラーが見落とされる可能性があり、予期しないシステム動作が発生する可能性があります。

次のシナリオを考えてみましょう。

OpenDbConnection(connectionString string, logSql bool) (*gorm.DB, error) {
    logger := zap.NewExample().Sugar()
    defer logger.Sync()
}

この例では、logger.Sync() メソッドが無視されるエラーを返す可能性があり、潜在的な問題が未解決のままになります。

可能な戦略

  • 名前付きエラー変数を使用する: 関数スコープ内でエラー変数を初期化し、遅延関数によって返されたエラーをそれに割り当てます。これにより、必要に応じてエラーを検査し、処理できるようになります。
  • 引数なしで呼び出し可能な遅延関数: 引数なしの匿名関数内で遅延関数を囲みます。これにより、遅延関数がエラーを返すことができ、そのエラーを名前付きのエラー変数に割り当てることができます。
  • エラーを返し、呼び出し元の関数で処理します。 関数からエラーを返すそして、呼び出し元の関数がそれを適切に処理できるようにします。エラーに特別な処理や分析が必要な場合は、これが推奨される可能性があります。

名前付きエラー変数戦略を使用した例を次に示します。

func OpenDbConnection(connectionString string, logSql bool) (db *gorm.DB, err error) {
    logger := zap.NewExample().Sugar()
    defer func() {
        err = logger.Sync()
    }()

    // ... rest of function logic ...

    return db, err
}

このアプローチでは、エラーは次のようになります。呼び出し関数でチェックおよび処理されます:

db, err := OpenDbConnection(connectionString, logSql)
if err != nil {
    // Handle the error
}

以上がGo で Defer によって返されたエラーを適切に処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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