ホームページ > バックエンド開発 > Golang > 「defer func() { recur() }()」 は成功するのに、「defer Recovery()」 はパニックの捕捉に失敗するのはなぜですか?

「defer func() { recur() }()」 は成功するのに、「defer Recovery()」 はパニックの捕捉に失敗するのはなぜですか?

Susan Sarandon
リリース: 2024-11-30 21:35:17
オリジナル
883 人が閲覧しました

Why Does `defer recover()` Fail to Catch Panics, While `defer func() { recover() }()` Succeeds?

なぜ defer Recovery() はパニックをキャッチしないのですか?

質問:

なぜ defer func() の呼び出しは行われるのでしょうか? ) { reverse() }() はパニック状態の goroutine を正常に回復しましたが、recover() の呼び出しを延期しました。そうでない?

答え:

recover() のドキュメントによると、「recover が遅延関数の外で呼び出された場合、パニックシーケンスを止めない。"

延期の場合recover()、recover()自体は遅延関数です。したがって、それ自体は呼び出されず、パニック シーケンスが継続します。

recover() がそれ自体を遅延関数として呼び出すと、パニック シーケンスが停止します。しかし、これは非論理的です。

興味深いバリエーション:

次のコードもパニックを回避します:

package main

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

ここでは、組み込みのrecover()関数を呼び出す関数値を持つrecover変数。この変数の値の呼び出しを延期することで、組み込みのrecover()を呼び出し、パニックシーケンスを停止します。

以上が「defer func() { recur() }()」 は成功するのに、「defer Recovery()」 はパニックの捕捉に失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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