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에서 사용해 보세요):
c2e572c1c34a0369ef7989373914f540모든 지연된 함수가 호출되더라도 panic()
,所有延迟函数都会执行,并且打印的最终恐慌序列包含传递给所有 panic()
호출의 가치.
지연 함수 내에서 recover()
를 호출하면 최종 출력물에 "복구됨" 상태 또는 메시지가 표시됩니다.
출력(Go Playground에서 사용해 보세요):
으아아아위 내용은 특히 이미 패닉 상태인 경우, 지연 함수 내에서 패닉 상태가 되어도 괜찮나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!