Go のネストされた遅延関数で「recover()」が「nil」を返すのはなぜですか?

Patricia Arquette
リリース: 2024-11-24 06:56:09
オリジナル
907 人が閲覧しました

Why Does `recover()` Return `nil` in Nested Deferred Functions in Go?

ネストされた遅延関数での 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート