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

Barbara Streisand
풀어 주다: 2024-11-07 03:13:02
원래의
899명이 탐색했습니다.

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

Go 루틴에서 패닉 처리

Go는 예상치 못한 오류와 치명적인 상황을 관리하기 위해 내장된 당황() 및 복구()를 제공합니다. 실행 코드. Go 루틴에서 패닉을 처리하려면 Recover()의 범위를 이해하는 것이 중요합니다.

recover() 범위 이해

recover()는 패닉에서만 복구할 수 있습니다. 패닉을 일으킨 동일한 goroutine 내에서. 활성 복구()가 없는 고루틴에서 패닉이 발생하면 전체 프로그램이 충돌합니다.

잘못된 오류 처리의 예

질문에 제공된 코드 예 handler() 고루틴에서 패닉이 발생하는 동안 복구()가 메인 루틴에 정의되어 있기 때문에 패닉 처리에 실패합니다. 결과적으로 복구()는 패닉 값에 액세스할 수 없습니다.

func main() {
    // ...

    go handle(done)
    // ...
}

func handle(done chan int64) {
    // ...
    fmt.Println(*a) // Panic here
    done <- *a      // Dereferencing nil pointer
}
로그인 후 복사

올바른 오류 처리의 예

고루틴에서 발생한 패닉을 처리하려면 복구를 배치하세요. ()는 고루틴 자체 내에 있습니다.

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 <- *a      // Dereferencing nil pointer
}
로그인 후 복사

설명

이 수정된 예에서 복구()는 이제 핸들() 고루틴 내에 있으므로 캡처할 수 있습니다. nil 포인터를 역참조함으로써 발생하는 패닉. 그런 다음 패닉이 복구되고 "Recovered" 메시지가 인쇄됩니다.

Go 루틴에서 효과적인 오류 처리를 위해서는 Recover()의 범위를 이해하는 것이 중요합니다. 예상치 못한 상황을 우아하게 처리하고 보고하려면 패닉이 발생할 수 있는 동일한 고루틴 내에 항상 Recover()를 배치하세요.

위 내용은 Go 루틴에서 패닉을 처리하는 방법: 복구 범위를 이해합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿