중첩 지연 함수의 복구() 제한 이해
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 사양에 따르면:
예제 1에서 printRecover()는 패닉 값을 반환할 수 있는 지연된 함수입니다. 그러나 예제 2에서는 printRecover()가 익명 함수에 의해 호출된 후 연기됩니다. 이로 인해 Recover()는 지연된 함수에 의해 직접 호출되지 않기 때문에 nil을 반환하게 됩니다.
따라서 중첩된 지연 함수 내에서 패닉을 성공적으로 복구하려면 복구()가 지연된 함수에서 직접 호출되어야 합니다.
위 내용은 Go의 중첩 함수와 중첩되지 않은 지연 함수의 `recover()` 동작은 어떻게 다릅니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!