Ana içeriğe geç
Modül 2 · Ders 5 ders 5Kurstaki 10/50~12 min
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:

Go
type error interface {
    Error() string
}

Error() string uygulayan her tür bir error'dir.

Temel model

Go
v, err := operazione()
if err != nil {
    // gestisci o propaga
    return err
}
// usa v

Bunu 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

Go
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:

Go
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):

Go
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:

Go
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

Egzersiz#go.m2.l5.e1
Denemeler: 0Yükleniyor…

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

Düzenleyici yükleniyor…
İ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

Egzersiz#go.m2.l5.e2
Denemeler: 0Yükleniyor…

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.

Düzenleyici yükleniyor…
İ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

Quiz#go.m2.l5.e3
Hazır

Go'da bir hatayı ele almak için kullanılan deyimsel kalıp hangisidir?

Go
v, err := f()
// poi?
Cevap seçenekleri

Özet

  • error tek yönteme sahip bir arayüzdür Error() string.
  • Kanonik kalıp: v, err := f(); if err != nil { return err }.
  • errors.New(msg) veya fmt.Errorf("ctx: %w", err) ile hatalar oluşturun.
  • Sarma için %w ve zinciri incelemek için errors.Is / errors.As kullanın.
  • panic yalnızca kurtarılamayan hatalar için, normal kontrol akışı için DEĞİL.