0Pricing
Go Academy · Ders

panic, recover ve defer

Ne zaman panic kullanılacağını ve düzgün biçimde nasıl recover edileceğini öğrenin

panic, recover ve defer, CoddyKit'te ücretsiz bir Go Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Go Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Go Academy kursu toplamda 4 dersten oluşur.

Panik Nedir?

panic, geçerli goroutine'in normal yürütmesini durdurur, ertelenmiş işlevleri çalıştırarak çağrı yığınını çözer ve kurtarılmadığı takdirde programı çökertir:

package main
import "fmt"

func mustPositive(n int) int {
    if n <= 0 {
        panic(fmt.Sprintf("mustPositive: got %d", n))
    }
    return n
}

func main() {
    fmt.Println(mustPositive(5))  // 5
    // fmt.Println(mustPositive(-1)) // panics!
}

Panik Ne Zaman Kullanılmalı

panic yalnızca şu durumlarda kullanılmalıdır:

  • Gerçekten kurtarılamayan programcı hataları (bozulmuş değişmezler)
  • Bir programlama hatasına işaret eden olanaksız koşullar
  • Başlangıç başarısızlıkları (eksik yapılandırma, başlatma sırasında başarısız bağlantılar)

Beklenen başarısızlık koşullarında asla panic kullanmayın; bunun yerine error kullanın.

Erteleme Temelleri

defer, çevreleyen işlev döndüğünde çalıştırılmak üzere bir işlev çağrısı planlar; işlevin normal, hatalı veya panik nedeniyle dönmesinden bağımsız olarak çalışır:

package main
import "fmt"

func main() {
    defer fmt.Println("third")
    defer fmt.Println("second")  // LIFO order
    defer fmt.Println("first")
    fmt.Println("running...")
    // Output:
    // running...
    // first
    // second
    // third
}

Temizleme İçin Erteleme

defer kullanımının en yaygın amacı, kaynakların temizlenmesini güvence altına almaktır:

package main
import ("fmt"; "os")

func readFile(path string) (string, error) {
    f, err := os.Open(path)
    if err != nil {
        return "", fmt.Errorf("open: %w", err)
    }
    defer f.Close()  // always runs, even if we return early

    buf := make([]byte, 1024)
    n, _ := f.Read(buf)
    return string(buf[:n]), nil
}

kurtarma — Panikleri Yakalama

recover, paniği durdurur ve panik değerini döndürür. Doğrudan bir defer işlevinin içinde çağrılmalıdır:

package main
import "fmt"

func safeDiv(a, b int) (result int, err error) {
    defer func() {
        if r := recover(); r != nil {
            err = fmt.Errorf("recovered from panic: %v", r)
        }
    }()
    return a / b, nil  // panics if b==0
}

func main() {
    r, err := safeDiv(10, 0)
    fmt.Println(r, err)
    // 0 recovered from panic: runtime error: integer divide by zero
}

recover Ertelenen İşlev İçinde Olmalıdır

recover yalnızca doğrudan ertelenmiş bir işlevin içinde çağrılırsa çalışır. Başka bir yerde çağrıldığında nil döndürür:

package main
import "fmt"

func wrong() {
    // recover() here does nothing — not in defer
}

func correct() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("caught:", r)
        }
    }()
    panic("oops")
}

func main() { correct() }

Kütüphane Kodunda Panik

Kütüphane kodu, paniklerin çağıranlara ulaşmasına neredeyse hiçbir zaman izin vermemelidir. Sınırda panikleri hatalara dönüştürün:

package main
import ("fmt"; "runtime/debug")

func safeCall(fn func()) (err error) {
    defer func() {
        if r := recover(); r != nil {
            err = fmt.Errorf("panic: %v\n%s", r, debug.Stack())
        }
    }()
    fn()
    return nil
}

func main() {
    err := safeCall(func() { panic("boom") })
    fmt.Println(err != nil) // true
}

Ertelemede LIFO Sırası ve Döngü Tuzağı

Ertelenen çağrılar son giren, ilk çıkar (LIFO) sırasıyla çalışır. Döngülerin içinde erteleme yaparken dikkatli olun; bir kapanış veya yardımcı işlev kullanın:

package main
import "fmt"

func processFiles(names []string) {
    for _, name := range names {
        name := name  // capture loop variable
        defer func() { fmt.Println("close:", name) }()
    }
}

func main() {
    processFiles([]string{"a.txt", "b.txt", "c.txt"})
    // Output (LIFO): close: c.txt, close: b.txt, close: a.txt
}

Adlandırılmış Döndürme Değerleriyle Erteleme

Ertelenen işlevler, adlandırılmış döndürme değerlerini okuyup değiştirebilir; bu, hatalara açıklama eklemek için kullanışlıdır:

package main
import "fmt"

func doWork() (err error) {
    defer func() {
        if err != nil {
            err = fmt.Errorf("doWork: %w", err)
        }
    }()
    return fmt.Errorf("something failed")
}

func main() {
    err := doWork()
    fmt.Println(err) // doWork: something failed
}

panic ve error: Karar Rehberi

panic ile error arasında seçim yapma:

  • hata kullanın: beklenen başarısızlıklar (dosya bulunamadı, ağ zaman aşımı, geçersiz girdi)
  • panik kullanın: programlama hataları (nil haritaya erişim, sınır dışı erişim), olanaksız durumlar, başlatma başarısızlıkları
  • API sınırlarında asla panic kullanmayın; çağıranlar bunu ele alamaz
  • Çökmeleri önlemek için sunucularda panikleri goroutine'in en üst düzeyinde kurtarın

Hızlı Kontrol

Bir paniği yakalamak için recover() nerede çağrılmalıdır?

Özet: panic, recover ve defer

Özet:

  • panic: yığını çözer, ertelenen işlemleri çalıştırır ve kurtarılmamışsa çöker
  • defer: işlevden çıkılırken çalışır (normal çıkışta, hata durumunda veya panikte); LIFO sırasıyla
  • recover: paniği durdurur ve bir değer döndürür; defer içinde olmalıdır
  • panic'i beklenen başarısızlıklar için değil, programcı hataları için kullanın
  • API sınırlarında panic'leri hatalara dönüştürün

Sıkça Sorulan Sorular

“panic, recover ve defer” dersi ücretsiz mi?

Evet — “panic, recover ve defer” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Go Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Go Academy kursu toplamda 4 dersten oluşur.

“panic, recover ve defer” dersinde ne öğreneceğim?

Ne zaman panic kullanılacağını ve düzgün biçimde nasıl recover edileceğini öğrenin Go Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Go Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Go Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“panic, recover ve defer” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Go Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Go Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. error Arayüzü
  2. Özel Hatalar Oluşturma
  3. Hataları Sarma ve Açma
  4. panic, recover ve defer
← Go Academy Sayfasına Dön