Go'da panic - recover
Dec 28, 2019 · 1 minute read · Commentsprogramminggo
- Her goroutine icerisinde olusacak panic’leri yakalayabilmesi icin kendi
recover()
‘i olmasi gerekmektedir. - Goroutine’in disinda olan bir
recover()
goroutine icerisinde olusucak panicleri yakalayamaz. - Yakalanmayan her panic uygulamanin crash olmasina sebep olur.
Asagidaki ornegi incelediginizde main
fonksiyonu icerisine panic’leri
recover etmek icin defer myRecover()
eklenmis lakin Go Playground uzerinden calistirdiginizda uygulamanin crash oldugunu goreceksiniz.
package main
import (
"fmt"
"time"
)
func myRecover() {
if r := recover(); r != nil {
fmt.Println("Panic recovered: ", r)
}
}
func crasher() {
panic("let me crash")
}
func main() {
defer myRecover()
go crasher()
time.Sleep(1 * time.Second)
fmt.Println("Program duzgun bir sekilde sonlandirildi")
}
Uygulamanin crash olmasinin sebebi daha oncede belirttigim gibi goroutine icerisinde panic recover edilmediginden dolayi.
crasher()
fonksiyonu goroutine olarak calistirilmayip direk cagrilsaydi main icerisindeki recover panic’i yakalardi fakat crasher()
goroutine olarak calistirildigi icin main
fonksiyonu icerisindeki recover panic’i yakalayamadi.
Asagidaki gibi crasher()
icerisine recover ekledigimizde panic’in duzgun bir sekilde handle edildigini goreceksiniz. Go Playground linki
func crasher() {
defer myRecover()
panic("let me crash")
}
func main() {
go crasher()
time.Sleep(1 * time.Second)
fmt.Println("Program duzgun bir sekilde sonlandirildi")
}