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