ホームページ >バックエンド開発 >Golang >Golang の既存のパニック中に Defer 関数内でパニックを起こすことはできますか?

Golang の既存のパニック中に Defer 関数内でパニックを起こすことはできますか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-02 12:03:03435ブラウズ

Can You Panic Within a Defer Function During an Existing Panic in Golang?

特にパニックがすでに発生している場合、遅延関数内でパニックを発生させることは許容されますか?

コンテキスト:

In提供されたコード:

<code class="go">func sub(){
    defer func (){
        panic(2)
    }()
    panic(1)
}

func main(){
    defer func(){
        x:=recover()
        println(x.(int));
    }()
    sub()
}</code>

と表示されます最初のパニック (panic(1)) が 2 番目のパニック (panic(2)) によって「上書き」されること。

それは受け入れられますか?

Golang では、遅延関数によるパニックは、明確なまたは例外的な状態を構成しません。これは、単にパニック シーケンスが継続することを示しています。

コード例で示したように、defer 関数内でパニックする可能性のある Golang 関数を呼び出すことが許可されます。パニックがすでに発生している場合でも、遅延関数内でパニックを発生させることができます。

メカニズム:

Go の仕様によると:

「新しいパニックを開始せずに D が正常に戻ると、パニック シーケンスは停止します。」

この例では、遅延関数 (D) は、新たなパニックを引き起こすことなく戻ります。したがって、panic(1) によって開始されたパニック シーケンスは停止します。

追加の考慮事項:

  • すべての遅延関数は、パニックを引き起こすかどうかに関係なく実行されます。 .
  • 遅延関数内のパニックは、既存のパニックを「上書き」するのではなく、「ラップ」します。ただし、recover() は最新の Panic() に渡された値のみを取得できます。
  • recover() で遅延関数をネストすることで、複数の Panic に渡された値を回復して処理することが可能です。

以上がGolang の既存のパニック中に Defer 関数内でパニックを起こすことはできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。