Panic, varsayılan davranış olarak uygulamayı çökertmek için tasarlanmıştır. Ancak bunun olmasını önlemek ve uygulamanızın hiçbir şey olmamış gibi çalışmaya devam etmesine izin vermek istiyorsanız, recover işlevini kullanmanız gerekir. Kural, sadece istediğin paniklerden geri dönmektir. Kısacası, varsayılan olarak her paniği kurtarmayın. Bunun yerine, panik tipini kontrol ederek seçici olarak kurtarın. Not: Uygulama belleği yetersiz gibi koşullar için kurtarma işlemi yapılamaz.


Örnekler


Geri dönüşsüz panic


Aşağıda gösterildiği gibi uygulama çöktü.


func main() {
fmt.Println("main: begin")

panic("Main function panicked!")

fmt.Println("main: end")
}

// Output:
// main: begin
// panic: Main function panicked!
//
// goroutine 1 [running]:
// main.main()
// /Users/mysql/Server/Go/src/github.com/inanzzz/client/cmd/client/main.go:4 +0xb3
// exit status 2

Tüm paniklerden geri dönüş


Aşağıda görüldüğü gibi, uygulama panikten kurtuldu ve çökmedi.


func main() {
defer func() {
if p := recover(); p != nil {
fmt.Println("main: recovered from panic")
}
}()

fmt.Println("main: begin")

panic("Main function panicked!")

fmt.Println("main: end")
}

// Output:
// main: begin
// main: recovered from panic

Paniklerden seçici olarak geri dönüş


Aşağıda görüldüğü gibi, uygulama sadece good panik türünden kurtarıldı.


type good struct {}
type bad struct {}

func main() {
defer func() {
switch p := recover(); p {
case nil:
case good{}:
log.Printf("recovered from %T\n", p)
case bad{}:
panic(p)
default:
panic(p)
}
}()

fmt.Println("main: begin")

//panic(good{})
//panic(bad{})
//panic("something else")

fmt.Println("main: end")
}

// Output for no panic at all.
// main: begin
// main: end

// Output when panic(good{}) is enabled.
// main: begin
// 2020/01/10 22:27:54 recovered from main.good

// Output when panic(bad{}) is enabled.
// main: begin
// ...
// /Users/inanzzz/Server/Go/src/github.com/inanzzz/client/cmd/client/main.go:11 +0xda
// ...
// exit status 2

// Output when panic("something else") is enabled.
// main: begin
// ...
// /Users/inanzzz/Server/Go/src/github.com/inanzzz/client/cmd/client/main.go:13 +0xda
// ...
// exit status 2