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 çökerdefer: işlevden çıkılırken çalışır (normal çıkışta, hata durumunda veya panikte); LIFO sırasıylarecover: paniği durdurur ve bir değer döndürür;deferiç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
- error Arayüzü
- Özel Hatalar Oluşturma
- Hataları Sarma ve Açma
- panic, recover ve defer