Go의 중첩 함수와 중첩되지 않은 지연 함수의 `recover()` 동작은 어떻게 다릅니까?

Susan Sarandon
풀어 주다: 2024-11-23 04:24:16
원래의
984명이 탐색했습니다.

How Does `recover()` Behavior Differ in Nested vs. Non-Nested Deferred Functions in Go?

중첩 지연 함수의 복구() 제한 이해

Golang에서 패닉 및 복구는 오류 처리 및 복구를 위한 메커니즘을 제공합니다. Recover()는 패닉 값을 반환하여 패닉을 처리하는 데 도움이 되지만 중첩된 지연 함수 내에서 동작이 변경됩니다.

예 1: 단순 지연 함수

다음 코드 조각을 고려하세요. :

package main

import "fmt"

func printRecover() {
    r := recover()
    fmt.Println("Recovered:", r)
}

func main() {
    defer printRecover()

    panic("OMG!") // Recoverable panic
}
로그인 후 복사

이 코드는 "OMG!"와 함께 패닉 상태가 됩니다. 출력에서 알 수 있듯이 지연된 printRecover() 함수를 사용하여 패닉 값을 성공적으로 복구합니다.

Recovered: OMG!
로그인 후 복사

예 2: 중첩된 지연 함수

이제 다음을 실행해 보겠습니다. 다른 지연된 함수로 printRecover()를 래핑합니다:

package main

import "fmt"

func printRecover() {
    r := recover()
    fmt.Println("Recovered:", r)
}

func main() {
    defer func() {
        printRecover()
    }()

    panic("OMG!") // Panic goes unrecoverable
}
로그인 후 복사

In 이 예에서 패닉은 복구할 수 없게 되고 프로그램은

Recovered: <nil>
panic: OMG!

goroutine 1 [running]:
main.main()
    /tmp/sandbox898315096/main.go:15 +0x60
로그인 후 복사

Understanding the Difference

라는 메시지와 함께 패닉 상태가 됩니다. 복구()가 호출됩니다. Golang 사양에 따르면:

  • recover()는 지연된 함수에 의해 직접 호출되지 않으면 nil을 반환합니다.

예제 1에서 printRecover()는 패닉 값을 반환할 수 있는 지연된 함수입니다. 그러나 예제 2에서는 printRecover()가 익명 함수에 의해 호출된 후 연기됩니다. 이로 인해 Recover()는 지연된 함수에 의해 직접 호출되지 않기 때문에 nil을 반환하게 됩니다.

따라서 중첩된 지연 함수 내에서 패닉을 성공적으로 복구하려면 복구()가 지연된 함수에서 직접 호출되어야 합니다.

위 내용은 Go의 중첩 함수와 중첩되지 않은 지연 함수의 `recover()` 동작은 어떻게 다릅니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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