panic (추천 학습: go)
범위를 벗어난 배열 액세스, 널 포인터 참조 등과 같은 복구할 수 없는 오류 상태가 발생하면 이러한 런타임 오류로 인해 패닉 예외가 발생합니다.
golang에서 try...catch...in과 같은 예외 잡기 문은 없지만, 예외를 던지고 예외를 잡기 위한 패닉 및 복구 내장 함수가 제공됩니다.
• 패닉 및 복구의 매개변수 유형은 인터페이스{}이므로 모든 유형의 객체가 발생할 수 있습니다.
• 프로그램에 치명적인 오류가 발생하여 전체 프로그램을 진행할 수 없는 경우 golang에서는 프로그램을 종료하는 패닉 기능을 제공합니다.
• 프로그램 패닉이 발생하면 복구를 사용하여 프로그램 제어권을 다시 확보하세요.
• 모든 패닉 예외가 런타임에서 발생하는 것은 아닙니다. 내장 패닉 함수를 직접 호출하면 패닉 예외가 발생합니다.
• 패닉 함수는 모든 값을 매개변수로 받아들입니다.
(1) 패닉 사용① 지연 디버깅 중에 발생한 오류는 이후의 지연 디버깅에서 catch할 수 있지만 마지막 오류만 catch할 수 있습니다.
func test() {defer func() { fmt.Println(recover()) }()defer func() { panic("defer panic") }() panic("test panic") }func main() { test() //defer panic}
②함수 패닉이 발생하면 실행이 종료됩니다. 모든 지연 함수가 실행된 후 프로그램 제어는 함수 호출자에게 반환됩니다. 이 프로세스는 현재 코루틴의 모든 기능이 반환되고 종료될 때까지 계속됩니다. 그런 다음 프로그램은 패닉 정보를 인쇄한 다음 스택 추적을 인쇄하고 마지막으로 프로그램이 종료됩니다.
함수에 패닉이 발생하지 않으면 복구 함수를 호출해도 정보를 얻을 수 없으며 현재 프로세스에 영향을 미치지 않습니다.
demo위 내용은 golang 패닉은 표준 오류를 캡처할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!package mainimport ( "fmt")func fullName(firstName *string, lastName *string) { if firstName == nil {
panic("Firsr Name can't be null")
} if lastName == nil {
panic("Last Name can't be null")
}
fmt.Printf("%s %s\n", *firstName, *lastName)
fmt.Println("returned normally from fullName")
}func test(){
defer fmt.Println("deferred call in test")
firName := "paul"
fullName(&firName, nil)
}func main() {
defer fmt.Println("deferred call in main")
test()
fmt.Println("returned normally from main")
}