ホームページ >バックエンド開発 >Golang >Defer `recover()` と `defer func() { remember() }()`: なぜ一方はパニックを回復し、他方は回復しないのか?

Defer `recover()` と `defer func() { remember() }()`: なぜ一方はパニックを回復し、他方は回復しないのか?

DDD
DDDオリジナル
2024-11-29 11:27:10979ブラウズ

Defer `recover()` vs. `defer func() { recover() }()`: Why Does One Recover Panics and the Other Doesn't?

defer Recovery() と defer func() { Recovery() }()

Q: なぜ defer func を呼び出す必要があるのですか() { reverse() }() はパニック状態の goroutine を正常に回復しますが、 defer reverse() の呼び出しは正常に回復します。違いますか?

A:cover() の公式ドキュメントに記載されているように:

「遅延関数の外で Recovery が呼び出された場合、パニック シーケンスは停止しません。」

defer reverse() の場合、recover() は遅延関数そのものです。実行時に、recover() はそれ自体を呼び出しません。したがって、パニック シーケンスを停止できません。

recover() がそれ自体を呼び出すことができれば、パニックは停止します。ただし、このシナリオは実現可能ではありません。

追加の考慮事項:

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

package main

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

この場合、組み込みのrecover()関数を呼び出す匿名関数を格納するために、関数タイプのrecoverという名前の変数が作成されます。次に、遅延関数が、recover 変数の値を呼び出すように設定されます。これにより、recover() 関数が間接的に呼び出され、パニック シーケンスが正常に停止されます。

以上がDefer `recover()` と `defer func() { remember() }()`: なぜ一方はパニックを回復し、他方は回復しないのか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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