>  기사  >  백엔드 개발  >  특히 이미 패닉 상태인 경우, 지연 함수 내에서 패닉 상태가 되어도 괜찮나요?

특히 이미 패닉 상태인 경우, 지연 함수 내에서 패닉 상태가 되어도 괜찮나요?

WBOY
WBOY앞으로
2024-02-11 20:33:08933검색

在 defer 函数内部发生恐慌是否可以,特别是当它已经发生恐慌时?

defer 함수 내부에서 패닉이 발생하면 영향을 미치나요? 이는 특히 공황 상황이 발생한 경우 일반적인 질문입니다. PHP에서 defer 함수는 현재 함수가 반환되기 전에 일부 정리 작업을 수행하는 데 사용됩니다. 패닉이 발생하면 프로그램은 즉시 실행을 중지하고 모든 연기 기능은 후입선출 순서로 실행됩니다. 따라서 패닉이 발생한 후에도 defer 함수는 계속 실행됩니다. 이는 리소스 릴리스 및 오류 처리와 같은 작업을 처리하는 데 유용합니다. 무슨 일이 일어나더라도 defer 함수는 항상 안정적으로 실행되어 코드의 무결성과 안정성을 보장합니다.

질문 내용

func sub(){
    defer func (){
        panic(2)
    }()
    panic(1)
}

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

이 코드를 시도했는데 첫 번째 패닉 panic(1) 被第二个恐慌 panic(2) "재정의"가 발생한 것 같습니다.

근데 이렇게 해도 괜찮나요? 아니면 지연 함수 내에서 패닉이 발생할 수 있는 Golang 함수를 호출하시나요?

(C++에서는 소멸자에서 예외를 던지는 것은 거의 용납되지 않습니다. 스택이 풀리면 프로그램이 종료됩니다. Golang에서도 비슷한 방식으로 당황하는 것이 나쁠지 궁금합니다.)

해결 방법

예 , 괜찮아요. 지연 기능으로 인한 패닉은 실제로는 새로운 특수 상태가 아니며 패닉 시퀀스가 ​​멈추지 않는다는 의미일 뿐입니다.

귀하의 예제 코드는 지연 기능을 중지하기 위한 panic() 称为可以通过对 recover()의 "상위" 호출도 괜찮다는 것을 증명합니다.

표준: 패닉 처리:

여기서 한 가지 주의할 점은 지연된 함수 내에서 panic(),所有其他延迟函数仍然会运行。另外,来自延迟函数的没有 recover()panic() 宁愿“包装”现有的恐慌,而不是“覆盖”它(尽管 recover() 调用确实只会返回传递给最后一次 panic() 호출을 호출하더라도 마찬가지입니다.

이 예를 참조하세요:

으아아아

출력(Go Playground에서 사용해 보세요):

c2e572c1c34a0369ef7​989373914f540

모든 지연된 함수가 호출되더라도 panic(),所有延迟函数都会执行,并且打印的最终恐慌序列包含传递给所有 panic()호출의 가치.

지연 함수 내에서 recover()를 호출하면 최종 출력물에 "복구됨" 상태 또는 메시지가 표시됩니다.

으아아아

출력(Go Playground에서 사용해 보세요):

으아아아

위 내용은 특히 이미 패닉 상태인 경우, 지연 함수 내에서 패닉 상태가 되어도 괜찮나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제