入れ子になった遅延関数の Recovery() の制限について
Golang では、panic とcover はエラー処理と回復のためのメカニズムを提供します。 reverse() はパニック値を返すことでパニックの処理に役立ちますが、ネストされた遅延関数内では動作が変わります。
例 1: 単純な遅延関数
次のコード スニペットを考えてみましょう。 :
package main import "fmt" func printRecover() { r := recover() fmt.Println("Recovered:", r) } func main() { defer printRecover() panic("OMG!") // Recoverable panic }
このコードは「OMG!」でパニックになります。そして、出力に示されているように、遅延 printRecover() 関数を使用してパニック値を正常に回復します。
Recovered: OMG!
例 2: ネストされた遅延関数
次に、 printRecover() を別の遅延関数でラップします:
package main import "fmt" func printRecover() { r := recover() fmt.Println("Recovered:", r) } func main() { defer func() { printRecover() }() panic("OMG!") // Panic goes unrecoverable }
この中でたとえば、パニックが回復不能になり、プログラムは次のメッセージでパニックします。
Recovered: <nil> panic: OMG! goroutine 1 [running]: main.main() /tmp/sandbox898315096/main.go:15 +0x60
違いを理解する
これら 2 つの例の違いは、回復方法にあります。 () と呼ばれます。 Golang 仕様によると:
例 1 では、printRecover() は、 deferred 関数を使用すると、パニック値を返すことができます。ただし、例 2 では、printRecover() が匿名関数によって呼び出され、その後遅延されます。これにより、recover() は遅延関数によって直接呼び出されないため nil を返します。
したがって、ネストされた遅延関数内でパニックを正常に回復するには、recover() を遅延関数から直接呼び出す必要があります。
以上がGo のネストされた遅延関数とネストされていない遅延関数では、「recover()」の動作はどのように異なりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。