ネストされた遅延関数での Recover() の動作
Go では、panic() と reverse() は実行時エラーの処理に使用されます。 。ただし、回復可能なエラーは遅延関数で処理する必要があります。
単純なケース:
単純な遅延関数シナリオでは、recover() は期待どおりに機能します:
package main import "fmt" func printRecover() { r := recover() fmt.Println("Recovered:", r) } func main() { defer printRecover() panic("OMG!") }
ネストされた遅延ケース:
printRecover() がネストされた遅延関数でラップされている場合:
func main() { defer func() { printRecover() }() panic("OMG!") }
動作が変わります。 printRecover()のrecover()はnilを返します。その理由は次のとおりです。
Go の仕様によれば:
recover() が遅延関数によって直接呼び出されなかった場合、recover() の戻り値は nil です。
ネストされた場合、printRecover() は最初の関数によって直接呼び出されるのではなく、ネストされた遅延関数によって呼び出されます。 one.
結論:
recover() がネストされた遅延関数で機能するには、パニックを処理する遅延関数によって直接呼び出される必要があります。この条件が満たされない場合、recover() は nil を返します。
以上がGo のネストされた遅延関数で「recover()」が「nil」を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。