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

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

Susan Sarandon
Susan Sarandonオリジナル
2024-11-30 21:35:17972ブラウズ

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 サイトの他の関連記事を参照してください。

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