>  기사  >  백엔드 개발  >  Golang의 기존 패닉 중에 Defer 함수 내에서 패닉이 발생할 수 있나요?

Golang의 기존 패닉 중에 Defer 함수 내에서 패닉이 발생할 수 있나요?

Susan Sarandon
Susan Sarandon원래의
2024-11-02 12:03:03357검색

Can You Panic Within a Defer Function During an Existing Panic in Golang?

특히 패닉이 이미 발생한 경우 Defer 함수 내에서 패닉이 허용됩니까?

컨텍스트:

In 제공된 코드:

<code class="go">func sub(){
    defer func (){
        panic(2)
    }()
    panic(1)
}

func main(){
    defer func(){
        x:=recover()
        println(x.(int));
    }()
    sub()
}</code>

첫 번째 패닉(panic(1))이 두 번째 패닉(panic(2))으로 "덮어쓰기"된 것으로 보입니다.

허용됩니까?

Golang에서 지연된 기능으로 인한 당황은 뚜렷하거나 예외적인 조건을 구성하지 않습니다. 이는 단순히 패닉 시퀀스가 ​​지속된다는 것을 나타냅니다.

예제 코드에서 설명한 것처럼 defer 함수 내에서 패닉이 발생할 수 있는 Golang 함수를 호출하는 것이 허용됩니다. 패닉이 이미 발생한 경우에도 defer 함수 내에서 패닉이 발생하는 것은 허용됩니다.

메커니즘:

Go 사양에 따르면:

"D가 새로운 패닉을 시작하지 않고 정상적으로 반환되면 패닉 시퀀스가 ​​중지됩니다."

이 예에서 지연된 함수(D)는 새로운 패닉을 트리거하지 않고 반환됩니다. 따라서패닉(1)에 의해 시작된 패닉 시퀀스가 ​​중지됩니다.

추가 고려 사항:

  • 패닉 발생 여부에 관계없이 모든 지연된 함수가 실행됩니다. .
  • 지연된 함수 내의 패닉은 기존 패닉을 "덮어쓰는" 것이 아니라 "포장"합니다. 그러나 복구()는 가장 최근의 패닉()에 전달된 값만 검색할 수 있습니다.
  • recover()에 지연 함수를 중첩하면 여러 패닉에 전달된 값을 복구하고 처리할 수 있습니다.

위 내용은 Golang의 기존 패닉 중에 Defer 함수 내에서 패닉이 발생할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.