"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Go 루틴에서 패닉을 처리하는 방법: 복구 범위를 이해합니까?

Go 루틴에서 패닉을 처리하는 방법: 복구 범위를 이해합니까?

2024년 11월 10일에 게시됨
검색:144

How to Handle Panics in Go Routines: Understanding Recover Scope?

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