10/01/2020 - GO
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.
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
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
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