Go 루틴에서 패닉 처리
Go는 예상치 못한 오류와 치명적인 상황을 관리하기 위해 내장된 당황() 및 복구()를 제공합니다. 실행 코드. 이동 루틴에서 패닉을 처리하려면 Recover()의 범위를 이해하는 것이 중요합니다.
recover() 범위 이해
recover()는 패닉에서만 복구할 수 있습니다. 패닉을 일으킨 동일한 goroutine 내에서. 활성 복구()가 없는 goroutine에서 패닉이 발생하면 전체 프로그램이 충돌합니다.
잘못된 오류 처리의 예
질문에 제공된 코드 예 handler() 고루틴에서 패닉이 발생하는 동안 복구()가 메인 루틴에 정의되어 있기 때문에 패닉 처리에 실패합니다. 결과적으로, Recover()는 패닉 값에 액세스할 수 없습니다.
func main() { // ... go handle(done) // ... } func handle(done chan int64) { // ... fmt.Println(*a) // Panic here done올바른 오류 처리의 예
고루틴에서 발생한 패닉을 처리하려면 고루틴 자체 내에 복구()를 배치하세요.
func main() { // ... defer func() { if r := recover(); r != nil { fmt.Println("Recovered") } }() go handle(done) // ... } func handle(done chan int64) { // ... defer func() { if r := recover(); r != nil { fmt.Println("Recovered") } }() fmt.Println(*a) // Panic here done설명
이 수정된 예에서 Recover()는 이제 handler() 고루틴 내에 있으므로 nil 포인터를 역참조하여 발생한 패닉을 캡처할 수 있습니다. 그런 다음 패닉이 복구되고 "Recovered" 메시지가 인쇄됩니다.
recover()의 범위를 이해하는 것은 Go 루틴에서 효과적인 오류 처리에 매우 중요합니다. 예상치 못한 상황을 우아하게 처리하고 보고하려면 패닉이 발생할 수 있는 동일한 고루틴 내에 항상 Recover()를 배치하세요.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3