Go ルーチンは、強力な同時実行メカニズムを提供し、独立したタスクの並列実行を可能にします。ただし、Go ルーチン内でのパニックの処理には課題が生じる可能性があります。
Go ルーチンでのリカバリについて
recover 関数を使用すると、関数のスコープ内で発生したパニックからリカバリできます。ただし、その有効性は、パニックが発生する同じゴルーチンに限定されます。他の goroutine でパニックから回復しようとすると失敗します。
コード例: パニック回復の失敗
次に、ある goroutine でパニックから回復できないことを示すコード スニペットを示します。 go ルーチン:
func main() { // Note: the following code will panic go handle(make(chan int64)) for {} } func handle(done chan int64) { var a *int64 a = nil fmt.Println(*a) done <- *a }
このコードは、パニックを開始した同じ goroutine 内で回復を呼び出す必要があるため、ハンドル goroutine 内のパニックから回復できません。
コード例:パニック回復の成功
Go ルーチンでパニックから正常に回復するには、問題のある goroutine 内に defer Recovery ステートメントを追加する必要があります。期待どおりに動作する以前のコードの修正バージョンを次に示します。
func main() { done := make(chan int64) go func() { defer func() { if r := recover(); r != nil { fmt.Println("Recovered") } }() var a *int64 a = nil fmt.Println(*a) done <- *a }() for {} }
この例では、遅延回復ステートメントにより、ゴルーチンがパニックを適切に処理し、回復メッセージを記録できるようになります。
基礎となるメカニズム
Go ドキュメントによると、パニック終了は、現在のゴルーチン内のすべての遅延関数が実行された場合にのみ発生します。したがって、go ルーチンでパニックから回復するには、通常は遅延関数を介して、パニックを開始した同じゴルーチン内で回復を呼び出す必要があります。
以上がGo ルーチンでのパニックから回復するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。