Go 함수에서 패닉을 처리하고 반환을 연기하는 방법은 무엇입니까?

DDD
풀어 주다: 2024-11-15 05:35:02
원래의
317명이 탐색했습니다.

How to Handle Panics and Defer Returns in Go Functions?

Go에서 반환 연기

Go에서 defer 문을 사용하면 주변 함수가 반환될 때까지 함수 실행을 연기할 수 있습니다. 이를 통해 런타임 중에 복구할 수 없는 오류가 발생할 때 발생할 수 있는 패닉 상황에서도 정리 작업을 실행할 수 있습니다.

패닉이 발생한 경우 함수에서 오류를 반환하려고 시도하는 다음 코드 조각을 고려하세요.

func getReport(filename string) (rep report, err error) {
    rep.data = make(map[string]float64)

    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered in f", r)
            err, _ = r.(error)
            return nil, err
        }
    }()
    panic("Report format not recognized.")
    // rest of the getReport function
}
로그인 후 복사

그런데 이 코드는 의도한 대로 작동하지 않습니다. 지연된 함수 내의 return 문은 함수 내의 지역 변수 err 및 rep만 수정하고 실제로 함수 외부에서는 이를 반환하지 않습니다.

이 문제를 해결하려면 지연된 함수 내부의 복구 함수를 사용하여 다음을 수행할 수 있습니다. 패닉 값을 검색하고 그에 따라 err 매개변수를 설정합니다. 또한 패닉 값의 유형을 확인하고 필요한 경우 이를 오류로 변환해야 합니다.

업데이트된 코드는 다음과 같습니다.

defer func() {
    if r := recover(); r != nil {
        fmt.Println("Recovered in f", r)
        switch x := r.(type) {
        case string:
            err = errors.New(x)
        case error:
            err = x
        default:
            err = errors.New("Unknown panic")
        }
        rep = nil
    }
}()
로그인 후 복사

이 코드는 err 매개변수가 다음으로 설정되도록 합니다. 패닉 값을 기반으로 적절한 오류를 확인하고, 불완전한 보고서 반환을 방지하기 위해 담당자 매개변수도 무효화합니다.

위 내용은 Go 함수에서 패닉을 처리하고 반환을 연기하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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