panic

panic fonksiyonu temel işlev bakımından belirlenen bir durum gerçekleştiğinde hata mesajı döndürerek işlemi sonlandırmak görevini üstlenir.

Birden çok işlemi arka arkaya yaptığımızda işlemin bir noktasında sistem arızasına neden olabilecek bir durumla karşılaşmamak adına buraya panic fonksiyonu ilave edilebilir. İşlem hata döndüreceği anda panic işlemi sonlandırır.

Bir örnek ele alalım :


package main 

import "fmt"

func PanicOlustur() {
	fmt.Println("Panik öncesi işlem")
	panic("Olağan dışı bir işlem gerçekleşti. İşlem sonlandırıldı")
	fmt.Println("Panik sonrası işlem") // işlem sonlandırıldığından dolayı görüntülenmez
}

func main(){
  PanicOlustur() 
}

Bu fonksiyonu çalıştırdığımızda aşağıdaki ekran çıktısını elde ederiz:


Panik öncesi işlem
panic: Olağan dışı bir işlem gerçekleşti. İşlem sonlandırıldı

goroutine 1 [running]:
learn/cookbook_go/pdf_opts.PanicOlustur()
        /home/gokayburuc/Documents/workspace/golang/learn_go/pdf_opts/panic_opts.go:32 +0x5f
main.main()
        /home/gokayburuc/Documents/workspace/golang/learn_go/main.go:11 +0xf
exit status 2


Burada dikkat ederseniz panic işlemi sonrasında işlem durdu. Sonrasında ise goroutine ifadesi çalışırken sonlandırıldığına dair bir mesaj geldi.İfadenin sonlanması ile birlikte hata mesajı geldi. Bunu düzeltmek için ilerleyen örneklerde recover ifadesini kullanacağız.

Şimdi panik işlemi ile ilgili bir diğer örneğe geçelim. Bu örnekte bölme işlemi yapan bir fonksiyon yazacağız ve 3 ile bölünebilen sayıları ekrana yazdıracağız. Eğer bölen 0 a eşit olursa işlem panic ifadesiyle durdurulacaktır.

package main 

import ("fmt")

func Bol(bolunen, bolen int) {

	// bolen ifadesi sıfıra esit olursa bir ifadenin sıfıra bölümü sonsuz olacağından dolayı işlemi durdur
	if bolen == 0 {
		panic("Sıfıra bölüm gerçekleşemez")
	} else {
		sonuc := bolunen / bolen
		fmt.Println("Sonuc: ", sonuc)
	}
}


func main() {
       Bol(22, 3)
       Bol(17, 0) // if bolen == 0 ifadesinden dolayı panic calisir ve islem durur 
       Bol(21, 3)
}

İfademizi çalıştırdığımızda aşağıdaki sonucu elde ederiz:

Sonuc:  7
panic: Sıfıra bölüm gerçekleşemez

goroutine 1 [running]:
learn/cookbook_go/pdf_opts.Bol(0x4bc5e8?, 0xc0000a8008?)
        /home/gokayburuc/Documents/workspace/golang/learn_go/pdf_opts/panic_opts.go:40 +0x9e
main.main()
        /home/gokayburuc/Documents/workspace/golang/learn_go/main.go:17 +0x67
exit status 2

yani ikinci ifademiz olan Bol(17, 0) ifadesinden dolayı işlem sonlandı.

DIKKAT: Bu çıktıdaki veri yolları benim bilgisayarımda test klasörüme ait veri yollarıdır. Test işlemleri için oluşturduğum proje klasörüne ait yollardır. Siz çalıştırdığınızda kendi proje klasörünüze ait yolları göreceksiniz!


learn/cookbook_go/pdf_opts.Bol(0x4bc5e8?, 0xc0000a8008?)
        /home/gokayburuc/Documents/workspace/golang/learn_go/pdf_opts/panic_opts.go:40 +0x9e
main.main()
        /home/gokayburuc/Documents/workspace/golang/learn_go/main.go:17 +0x67

Şimdi panic ifadelerinin yalnızca görüntülenmesi fakat programın çalışmasını durdurmaması için ne yapmamız gerektiğini göreceğiz. Burada bahsedeceğimiz ifade recover ifadesidir.

Güncel örneğimizle devam edelim. Örneğimize bir adet panic yakalayıcı recover fonksiyonu yazalım :


func PanikYakala() {


  panic_check := recover()

  if panic_check != nil {
    fmt.Println("RECOVER: ", panic_check)
  }

Şimdi kodumuzu bu fonksiyon ile güncelleyelim :

package main 

import "fmt"


func Bol(bolunen, bolen int) {

	defer PanikYakala() // sistem durduğunda işlem sonunda PanikYakala() fonksiyonun çalıştır 

	// bolen ifadesi sıfıra esit olursa bir ifadenin sıfıra bölümü sonsuz olacağından dolayı işlemi durdur
	if bolen == 0 {
		panic("Sıfıra bölüm gerçekleşemez")
	} else {
		sonuc := bolunen / bolen
		fmt.Println("Sonuc: ", sonuc)
	}
}

func PanikYakala() {
	panicYakala := recover()

	if panicYakala != nil {
		fmt.Println("RECOVER: ", panicYakala)
	}
}


func main() {
       Bol(22, 3)
       Bol(17, 0) // if bolen == 0 ifadesinden dolayı panic calisir ve islem durur 
       Bol(21, 3)
}

Kodumuzu çalıştırdığımızda aşağıdaki çıktıyı elde edeceğiz :

Sonuc:  7
RECOVER:  Sıfıra bölüm gerçekleşemez
Sonuc:  7

Görüldüğü üzere panic işlemi durdurmak istedi fakat recover fonksiyonumuz olayı ele alıp işlemi sonlandırdı.