Herkese merhaba!

Uzun yıllardır bol miktarda kişisel zaman ve enerji harcayarak bilgimizi hepinizle paylaşıyoruz. Ancak şu andan itibaren bu blogu çalışır durumda tutabilmek için yardımınıza ihtiyacımız var. Yapmanız gereken tek şey, sitedeki reklamlardan birine tıklamak olacaktır, aksi takdirde hosting vb. masraflar nedeniyle maalesef yayından kaldırılacaktır. Teşekkürler.

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