> 백엔드 개발 > Golang > Go에서 `defer Recover()`가 패닉을 포착하지 못하는 이유는 무엇입니까?

Go에서 `defer Recover()`가 패닉을 포착하지 못하는 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2024-12-05 02:08:09
원래의
887명이 탐색했습니다.

Why Doesn't `defer recover()` Catch Panics in Go?

defer Recover()는 언제 패닉을 포착하지 못합니까?

Go에서 defer 함수는 다음과 같은 경우 선언의 역순으로 실행됩니다. 함수가 정상적으로 반환되거나 패닉이 발생합니다. defer func() { Recover() }()는 패닉 상태에서 효과적으로 복구하지만 defer Recover()의 경우에는 그렇지 않습니다.

이 동작은 Recover() 문서에서 발생합니다. 복구는 지연된 함수 외부라고 불리며 패닉 시퀀스를 중지하지 않습니다." defer Recover()의 경우, 복구 자체는 지연된 함수이므로 자신을 호출하지 않습니다.

예:

다음 코드를 고려하세요.

package main

func main() {
    defer recover()
    panic("panic")
}
로그인 후 복사

이 코드는 실제로 "panic:panic" 메시지와 함께 패닉 상태가 됩니다. 이는 defer Recover()가 오류를 방지하지 못했음을 나타냅니다. 패닉.

작업 예:

반대로 다음 코드는 패닉에서 성공적으로 복구됩니다.

package main

func main() {
    defer func() { recover() }()
    panic("panic")
}
로그인 후 복사

이 경우 익명 함수는 주 함수가 반환되거나 패닉 상태에 빠졌을 때 호출됩니다. 이 익명 함수 내에서 Recover()가 호출되어 패닉을 성공적으로 포착하고 방지합니다.

예외 예:

흥미롭게도 다음 코드도 패닉을 방지합니다.

package main

func main() {
    var recover = func() { recover() }
    defer recover()
    panic("panic")
}
로그인 후 복사

여기에서 복구 함수 변수는 내장된 복구()를 호출하는 익명 함수에 대한 참조를 보유합니다. 이 변수를 지연된 함수로 지정하면 내장된 Recover()를 효과적으로 호출하여 패닉을 중지합니다.

위 내용은 Go에서 `defer Recover()`가 패닉을 포착하지 못하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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