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

Go ile uygulama gelistirirken main icerisinde ve baslatilacak her goroutine icerisinde ayri ayri panic recover etmek gerekmektedir.

Go web frameworkleri her request icin ayri bir goroutine baslatir, bu sayede bir userin requesti crash oldugunda kullaniciya 500 doner fakat diger userlar bundan etkilenmezler. Request crash oldugunda kullanicilara duzgun bir response donmek icin request handlerlar icerisinde panic recover’lar eklenebilir.

Load comments