Go 루틴에서 패닉 처리
Go 루틴에서 패닉이 발생하면 올바르게 처리하는 것이 중요합니다. 복구 기능을 사용하면 패닉 값을 효과적으로 검색하고 그에 따라 처리할 수 있습니다.
일반적인 접근 방식 중 하나는 지연된 함수를 사용하여 기본 기능에서 패닉을 처리하는 것입니다. 그러나 별도의 고루틴에서 패닉이 발생하면 이 접근 방식은 이를 포착하지 못합니다.
주어진 예에서:
func main() { done := make(chan int64) defer fmt.Println("Graceful End of program") defer func() { r := recover() if _, ok := r.(error); ok { fmt.Println("Recovered") } }() go handle(done) for { select { case <-done: return } } } func handle(done chan int64) { var a *int64 a = nil fmt.Println(*a) done <- *a }
패닉은 고루틴 내의 핸들 함수에서 발생하지만, 주 함수의 지연된 복구 기능은 이를 캡처할 수 없습니다. 이는 패닉이 발생한 동일한 고루틴에서 호출된 경우에만 복구가 작동하기 때문입니다.
이 문제를 해결하려면 지연된 복구 함수 호출을 핸들 함수 내에서 이동하세요.
func main() { done := make(chan int64) defer fmt.Println("Graceful End of program") go handle(done) for { select { case <-done: return } } } func handle(done chan int64) { defer func() { r := recover() if _, ok := r.(error); ok { fmt.Println("Recovered") } }() var a *int64 a = nil fmt.Println(*a) done <- *a }
이렇게 하면 수정을 통해 핸들 기능에 패닉이 발생하면 동일한 고루틴 내의 지연된 복구 기능이 이를 포착하고 그에 따라 처리합니다.
위 내용은 별도의 Go 루틴에서 패닉을 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!