Go で発生するパニックは非同期実行 (Goroutine) のためメインプロセスではキャッチできません。回避策には、リカバリ機能を使用してパニックをキャプチャおよびリカバリすることが含まれます。 Context パッケージを使用して Goroutine に値を渡し、パニックをログに記録します。カスタム パニック リスナーを使用して、メイン関数にリスナーを登録し、パニックをキャッチして処理します。
メインプロセスが Golang のパニックをキャッチできないのはなぜですか?
Go では、Panic はプログラムで回復不可能なエラーが発生したときに使用される組み込み関数です。プログラムの実行を停止し、エラー メッセージを出力します。ただし、場合によっては、メインプロセスでパニックを捕捉できない場合があります。
原因:
メインプロセスがパニックを捕捉できない主な理由は、非同期実行です。 Go では、Goroutine は並列実行される軽量のスレッドです。 Goroutine は独自のスタックで実行されるため、Goroutine でパニックが発生した場合、メイン プロセスはすぐには認識されません。
解決策:
この問題を解決するには、いくつかの方法があります:
リカバリを使用します。 function :
Context パッケージの使用:
パニック リスナーの使用:
例:
Recovery 関数を使用してパニックをキャプチャする例:
<code class="go">func main() { go func() { defer func() { if r := recover(); r != nil { fmt.Println("Panic recovered:", r) } }() panic("Oops, something bad happened.") }() time.Sleep(time.Second) // Give the Goroutine time to execute. }</code>
パニック リスナーを使用して、キャプチャパニックの例:
<code class="go">package main import ( "fmt" "sync/atomic" "time" ) var panicCount uint64 func main() { // 注册 Panic Listener runtime.SetPanicOnFault(true) runtime.SetTraceback("all") // 开启一个 Goroutine 来制造 Panic go func() { defer func() { if r := recover(); r != nil { fmt.Println("Panic recovered:", r) atomic.AddUint64(&panicCount, 1) } }() panic("Whoops, something bad happened.") }() time.Sleep(time.Second) // Give the Goroutine time to execute. // 检查 Panic 计数 if panicCount > 0 { fmt.Println("Total Panics:", panicCount) } else { fmt.Println("No Panics occurred.") } }</code>
以上がなぜメインプロセスは golang のパニックをキャッチできないのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。