ホームページ  >  記事  >  バックエンド開発  >  Go 関数がパニックになった場合にエラーを返す方法は?

Go 関数がパニックになった場合にエラーを返す方法は?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-12 00:39:03215ブラウズ

How to Return an Error if a Go Function Panics?

Go での Defer からの復帰

Go で関数がパニックした場合にエラーを返す必要があるという問題が発生しています。コードの分析と修正は次のとおりです。

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)
            switch x := r.(type) {
            case string:
                err = errors.New(x)
            case error:
                err = x
            default:
                err = errors.New("Unknown panic")
            }
            rep = nil // Invalidate rep
        }
    }()
    panic("Report format not recognized.")
    // rest of the getReport function...
}

パニックと遅延の概念

  • パニック: パニック信号defer 関数のリカバリによって捕捉される可能性のあるランタイム エラー。
  • Defer: defer ステートメントは、周囲の関数が終了するまで関数の実行を遅らせます。

コードの変更:

  • 遅延関数は、switch-case ステートメントを使用して回復された値を正しく処理するようになりました。
  • 回復された値が文字列の場合、errors.New() を使用してエラーに変換されます。
  • データが返されないように、エラーが発生した後、rep 変数は無効になります。
  • rep 変数は次のとおりです。エラーの場合は nil として返され、元の関数のシグネチャと一致します。

これらの変更により、getReport 関数は、無効なレポート形式が原因でパニックした場合にエラーを返すようになります。エラー メッセージは、パニック値 (文字列の場合) または不明なパニックを示す一般的なエラーのいずれかになります。

以上がGo 関数がパニックになった場合にエラーを返す方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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