ホームページ > バックエンド開発 > Golang > Go Panic Recovery: `recover()` の延期 – 違いは何ですか?

Go Panic Recovery: `recover()` の延期 – 違いは何ですか?

Patricia Arquette
リリース: 2024-12-03 03:35:11
オリジナル
552 人が閲覧しました

Go Panic Recovery: Deferring `recover()` – What's the Difference?

遅延 Recovery() と Defer Recovery() の比較

Go では、recover() 関数を使用してパニックを捕捉し、処理できます。 。ただし、recover() 呼び出しに対する defer の配置には重大な影響があることに注意することが重要です。

シナリオ A: defer func() { reverse() }()

このシナリオでは、defer ステートメントは、現在の関数の最後に実行される匿名関数をスケジュールします。この関数が実行されると、recover() 関数が呼び出されます。これは、周囲の関数が実行を再開する前にパニックが発生した場合でも、recover() 関数が実行されるため、パニックをキャッチして処理する効果的な方法です。

シナリオ B: defer reverse()

このシナリオでは、recover() 関数自体が遅延関数としてスケジュールされています。ただし、recover() はそれ自体を呼び出さないため、これは意図したとおりに機能しません。したがって、囲んでいる関数が実行を再開する前に発生するパニックは、この遅延呼び出しによって捕捉されません。

この動作は Go ドキュメントに文書化されています。パニック シーケンス。"

興味深い例: defer (func() { reverse() })()

これをさらに詳しく説明するために、次のコードを考えてみましょう。

var recover = func() { recover() }
defer recover()
panic("panic")
ログイン後にコピー

驚くべきことに、このコードもパニックを起こしません。この場合、関数タイプのリカバリ変数を作成し、それを組み込みのrecover()を呼び出す匿名関数に初期化します。次に、recover 変数の値を遅延関数として指定します。これにより、遅延関数が事実上、recover() を呼び出し、パニック シーケンスを停止するため、パニックをキャッチして処理することができます。

以上がGo Panic Recovery: `recover()` の延期 – 違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート