ホームページ >バックエンド開発 >Golang >Go 関数でパニックを処理し、リターンを延期する方法は?

Go 関数でパニックを処理し、リターンを延期する方法は?

DDD
DDDオリジナル
2024-11-15 05:35:02385ブラウズ

How to Handle Panics and Defer Returns in Go Functions?

Go でのリターンの遅延

Go では、defer ステートメントを使用すると、周囲の関数が戻るまで関数の実行を延期できます。これにより、パニックが発生した場合でもクリーンアップ タスクを実行できます。パニックは、実行時に回復不能なエラーが発生した場合に発生する可能性があります。

パニックが発生した場合に関数からエラーを返そうとする次のコード スニペットを考えてみましょう。

func getReport(filename string) (rep report, err error) {
    rep.data = make(map[string]float64)

    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered in f", r)
            err, _ = r.(error)
            return nil, err
        }
    }()
    panic("Report format not recognized.")
    // rest of the getReport function
}

ただし、このコードは意図したとおりに動作しません。遅延関数内の return ステートメントは、関数内のローカル変数 err と rep を変更するだけであり、実際にそれらを関数の外に返すことはありません。

この問題を解決するには、遅延関数内で回復関数を使用して、パニック値を取得し、それに応じて err パラメータを設定します。さらに、パニック値のタイプをチェックし、必要に応じてエラーに変換する必要があります。

更新されたコードは次のとおりです:

defer func() {
    if r := recover(); r != nil {
        fmt.Println("Recovered in f", r)
        switch x := r.(type) {
        case string:
            err = errors.New(x)
        case error:
            err = x
        default:
            err = errors.New("Unknown panic")
        }
        rep = nil
    }
}()

このコードでは、err パラメーターが確実に次のように設定されます。パニック値に基づいて適切なエラーを生成し、不完全なレポートが返されるのを防ぐために rep パラメータも無効にします。

以上がGo 関数でパニックを処理し、リターンを延期する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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