Go'da panic - recover


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")
}
Load comments