ホームページ >バックエンド開発 >Golang >なぜ Go では `defer reverse()` がパニックを起こさないのでしょうか?

なぜ Go では `defer reverse()` がパニックを起こさないのでしょうか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-05 02:08:09880ブラウズ

Why Doesn't `defer recover()` Catch Panics in Go?

defer Recovery() がパニックをキャッチできない場合は?

Go では、defer 関数は宣言の逆の順序で実行されます。関数は正常に戻るか、パニックになります。 defer func() { reverse() }() はパニックから効果的に回復しますが、 defer reverse() には同じことが当てはまりません。

この動作は、recover() のドキュメントに基づいています。リカバリは遅延関数の外で呼び出されますが、パニックシーケンスは停止しません。」 defer reverse() の場合、recover 自体は遅延関数であるため、それ自体を呼び出しません。

例:

次のコードを考えてみましょう。

package main

func main() {
    defer recover()
    panic("panic")
}

このコードは実際に「panic:panic」というメッセージでパニックを起こします。これは、defercover() がエラーを防止しなかったことを示しています。パニック。

実際の例:

対照的に、次のコードはパニックから正常に回復します:

package main

func main() {
    defer func() { recover() }()
    panic("panic")
}

この場合、匿名この関数は、main 関数が戻るかパニックしたときに呼び出されます。この匿名関数内で、recover() が呼び出され、パニックを正常にキャプチャして回避します。

例外的な例:

興味深いことに、次のコードでもパニックを回避できます。

package main

func main() {
    var recover = func() { recover() }
    defer recover()
    panic("panic")
}

ここで、recover 関数変数は、組み込みの reverse() を呼び出す匿名関数への参照を保持します。この変数を遅延関数として指定すると、組み込みのrecover()が効果的に呼び出され、パニックが停止します。

以上がなぜ Go では `defer reverse()` がパニックを起こさないのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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