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