> 백엔드 개발 > Golang > Go Goroutines에서 패닉을 어떻게 복구할 수 있나요?

Go Goroutines에서 패닉을 어떻게 복구할 수 있나요?

DDD
풀어 주다: 2024-12-13 09:01:10
원래의
533명이 탐색했습니다.

How Can I Recover from Panics in Go Goroutines?

Go 프로그램의 일반 패닉 복구

Go 루틴을 사용할 때 충돌이나 패닉을 포착하고 처리하고 싶은 경우가 있을 수 있습니다. 잠재적으로 Sentry 또는 Raygun과 같은 오류 보고 서버에 보고하기 위해 발생합니다. 그러나 고루틴은 다른 고루틴의 패닉에서 복구할 수 없다는 점에 유의하는 것이 중요합니다.

관용적인 접근 방식

이를 처리하는 관용적인 방법은 코드를 고루틴으로 실행되는 함수입니다. 여기에는 패닉 상태에서 복구할 수 있는 기능을 제공하는 복구()를 호출하는 지연 함수 활용이 포함됩니다.

다음 예를 고려하세요.

go func() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Caught:", r)
        }
    }()

    panic("catch me")
}()
로그인 후 복사

이 코드는 관련 패닉 상태를 출력합니다.

실행하는 모든 고루틴에서 이 접근 방식을 구현하는 것은 비현실적이지만 다음과 같은 명명된 함수를 정의하여 프로세스를 단순화할 수 있습니다. 복구 기능이 포함되어 있으며 고루틴 내에서 해당 함수를 호출합니다(지연 호출 사용).

func logger() {
    if r := recover(); r != nil {
        fmt.Println("Caught:", r)
    }
}
로그인 후 복사

지연 클로저 내에서 이 함수를 호출하면 패닉 상황을 간결하게 처리할 수 있습니다.

go func() {
    defer logger()
    panic("catch me")
}()
로그인 후 복사

래퍼 기능

더욱 편리하게 실제 함수를 입력으로 사용하고 패닉 복구 프로세스를 관리하는 래퍼 함수를 ​​만듭니다. 이 래퍼 기능은 다음과 같이 활용할 수 있습니다.

func wrap(f func()) {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Caught:", r)
        }
    }()

    f()
}
로그인 후 복사

이 래퍼를 사용하면 패닉 처리 프로세스가 더욱 단순화됩니다.

go wrap(func() {
    panic("catch me")
})
로그인 후 복사

추가 고려 사항

제공된 예제 코드는 Wrap() 함수 내에서 고루틴이 시작되는 상황을 보여줍니다. 이를 통해 호출자는 go 키워드를 사용하여 Wrap() 호출을 선행하여 새로운 고루틴이 필요한지 여부를 결정할 수 있습니다. 그러나 새로운 고루틴에서 동시에 실행하고 싶지 않은 경우에도 입력으로 전달된 임의 함수의 실행을 보호하기 위해 Wrap() 함수를 사용할 수도 있습니다.

위 내용은 Go Goroutines에서 패닉을 어떻게 복구할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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