Go プログラムでの一般的なパニックの回復
Go プログラムの同時実行ルーチンでパニックを引き起こす重大なエラーが発生した場合、正常に回復することが重要になります。これらの例外を処理し、Sentry や Raygun などの外部レポート サービスに報告します。ただし、別のゴルーチンで実行されているルーチンからパニックをキャプチャすることには課題が生じます。
ゴルーチン パニックの問題
ゴルーチンは、別のゴルーチンで発生したパニックから回復できません。この制限により、同時実行ルーチンからのパニックのキャプチャとレポートに問題が生じます。
慣用的な回復テクニック
同時実行ルーチンのパニックから回復するには、コードを回復された値をチェックする goroutine の関数。これを実現する標準的な方法は、recover() を呼び出す遅延関数を使用することです。
go func() { defer func() { if r := recover(); r != nil { fmt.Println("Caught:", r) } }() panic("catch me") }()
このアプローチにより、ゴルーチン内のパニックが遅延関数によって確実に捕捉され、それに応じてログに記録されます。
リカバリを簡略化するためのラッパー関数
回復プロセスでは、回復ロジックをカプセル化するラッパー関数を作成できます:
func wrap(f func()) { defer func() { if r := recover(); r != nil { fmt.Println("Caught:", r) } }() f() }
今度は、wrap() 関数を使用して、任意の goroutine 関数をパニックから保護できます:
go wrap(func() { panic("catch me") })
注: Wrap() 関数を使用すると、新しいゴルーチンを明示的に作成せずに任意の関数を実行できます。パニックからの回復はまだ確実です。
以上がGo でゴルーチンからのパニックを適切に処理して報告するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。