Modül dersleri (5/5)
Hatalar: "if err != sıfır" modeli
Go'da hatalar istisna değil, değerlerdir. Yapabileceğiniz bir işlev fail, hatayı son değer olarak döndürür ve arayan kişi bunu kontrol eder açıkça. Açıktır, tahmin edilebilirdir, test edilmesi kolaydır; fiyatı ise biraz daha fazla ayrıntı.
error arayüzü
error dilin içine yerleştirilmiş küçük bir arayüzdür:
type error interface {
Error() string
}Error() string uygulayan her tür bir error'dir.
Temel model
v, err := operazione()
if err != nil {
// gestisci o propaga
return err
}
// usa vBunu binlerce kez göreceksiniz: Bu her şeyin deyimsel kodudur. hatalı çağrı. Tekrarlama konusunda kendinizi suçlu hissetmeyin; bu bir özelliktir, değil bir hata.
Yapı hataları: errors.New ve fmt.Errorf
import (
"errors"
"fmt"
)
err1 := errors.New("file mancante")
err2 := fmt.Errorf("apertura %q fallita: permesso negato", path)fmt.Errorf mesaja değişkenler eklemek istediğinizde mükemmeldir.
%w ile sarmalama
Orijinali kaybetmeden bağlam eklerken bir hatayı yaymak için:
f, err := os.Open(path)
if err != nil {
return fmt.Errorf("config: %w", err)
}%w orijinal hatayı "sarar"; daha sonra kurtarılabilir.
errors.Is (nöbetçiler için eşitlik) veya errors.As (beton türü için):
if errors.Is(err, os.ErrNotExist) {
// file inesistente, gestione speciale
}Nöbetçi hataları
Bunlar, errors.Is ile karşılaştırmalar için kullanılan, değişkenler olarak dışa aktarılan hatalardır:
var ErrNotFound = errors.New("non trovato")
func find(id int) (Item, error) {
// ...
return Item{}, ErrNotFound
}
// chiamante:
if errors.Is(err, ErrNotFound) { ... }panic ve recover (önizleme)
panic Go'da mevcut ancak kurtarılamaz hatalara (ör. hatalar,
ihlal edilen değişmezler), normal kontrol akışı için değil. Daha derinlere ineceğiz
defer/recover ile İşlevler modülü. Şimdilik: yerinde kullanmayın
if err != nil modelinin.
Deneyin
strconv.Atoi'deki hatayı ele alın: eğer err != sıfır ise, yazdırın ve geri dönün; aksi halde yazdır
İpucu göster
Kurallı kalıp: 'hata != sıfır'ı kontrol edin, kayıt/dönüş yapın, ardından 'n'yi kullanın.
3 denemeden sonra çözüm mevcut
SafeDiv'i uygulayın: eğer b == 0 ise 0 ve bir hata döndürür.New('sıfır başına bölme'); aksi takdirde a/b ve sıfır.
İpucu göster
Çalışma zamanı paniğini önlemek için bölmeden ÖNCE 'b == 0' seçeneğini işaretleyin.
3 denemeden sonra çözüm mevcut
Go'da bir hatayı ele almak için kullanılan deyimsel kalıp hangisidir?
v, err := f()
// poi?Özet
errortek yönteme sahip bir arayüzdürError() string.- Kanonik kalıp:
v, err := f(); if err != nil { return err }. errors.New(msg)veyafmt.Errorf("ctx: %w", err)ile hatalar oluşturun.- Sarma için
%wve zinciri incelemek içinerrors.Is/errors.Askullanın. panicyalnızca kurtarılamayan hatalar için, normal kontrol akışı için DEĞİL.