Ana içeriğe geç
Modül 6 · Ders 5 ders 5Kurstaki 30/50~14 min
Modül dersleri (5/5)

Hata arayüzü

Go'daki error bir anahtar kelime değildir: yerleşik bir arayüzdür. tek yöntem.

Go
type error interface {
    Error() string
}

Error() string içeren her şey error'dir. ile kombine işlevlerden (T, error) döndürme kuralı, bu Go'da hata işlemenin temeli.

Nöbetçi hataları

Go
import "errors"

var ErrNotFound = errors.New("non trovato")

func find(key string) (string, error) {
    // ...
    return "", ErrNotFound
}

sentinel arayanın görebileceği, dışa aktarılmış bir error değeridir. Belirli bir hata durumunu tanımak için karşılaştırma yapın.

Özel hatalar (verilerle birlikte)

Bağlamı taşımak için (örneğin eksik anahtar) bir tür tanımlarsınız:

Go
type ErrNotFound struct {
    Key string
}

func (e *ErrNotFound) Error() string {
    return "non trovato: " + e.Key
}

func find(key string) (string, error) {
    return "", &ErrNotFound{Key: key}
}

hatalar.I'ler ve hatalar.As (Go 1.13+)

== ile karşılaştırmak yalnızca "saf" nöbetçiler için işe yarar. Sağlam olmak sarılmış hatalara karşı errors paketini kullanın:

Go
import "errors"

if errors.Is(err, ErrNotFound) {
    // err IS ErrNotFound (even if wrapped)
}

var nfe *ErrNotFound
if errors.As(err, &nfe) {
    // err IS (or wraps) an *ErrNotFound; nfe points to the concrete value
    fmt.Println("chiave mancante:", nfe.Key)
}
  • errors.Is(err, target): hedef sarma zincirinde bir yerdeyse doğru.
  • errors.As(err, &target): kendi türündeki zincirdeki ilk hatayı hedeflemeye atar.

%w ile sarmalama

Go
if err := find("k"); err != nil {
    return fmt.Errorf("operazione X: %w", err)
}

%w (%s veya %v DEĞİLDİR), dosyayı saran yeni bir hata oluşturur. orijinal, zincirin errors.Is/As ile gezinilebilir olmasını sağlıyor.

İşleme deseni

Go
v, err := op()
if err != nil {
    return fmt.Errorf("op fallita per %q: %w", id, err)
}

Deyimler:

  • err != nil hemen seçeneğini işaretleyin, "erken mutlu yol" yok.
  • fmt.Errorf("... : %w", err) ile her seviyeye bağlam ekleyin.
  • "Yukarı akış" (ana / işleyicinin yakınında), errors.Is/As ile ayrım yapın.

Deneyin

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

Error() dizesini *ErrNotFound'a uygulayın, böylece 'non trovato: <Key>' değerini döndürür.

Düzenleyici yükleniyor…
İpucu göster

`fmt.Println(err)` yapınızdaki Error() yöntemini otomatik olarak çağırır.

3 denemeden sonra çözüm mevcut

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

Hataları kullanın. Hatanın nöbetçi ErrVuoto'ya eşit olup olmadığını kontrol etmek için.

Düzenleyici yükleniyor…
İpucu göster

`errors.Is(err, target)` sarma zincirlerinde bile sağlamdır.

3 denemeden sonra çözüm mevcut

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

Hatayı uygulama yönteminin tam imzası nedir?

Go
func (e *MyErr) ??? {}
Cevap seçenekleri

Özet

  • error = interface { Error() string }, yerleşik.
  • Bağlam olmadan bilinen durumlar için errors.New("...") içeren nöbetçiler.
  • Bağlam taşıyacak alanlara sahip özel hata türleri.
  • errors.Is(err, target): sarmalamaya karşı dayanıklı karşılaştırma.
  • errors.As(err, &target): beton türünün çıkarılması.
  • fmt.Errorf("...: %w", err): zinciri koruyan sarma.
  • Sarmak için asla %v / %s: HER ZAMAN %w kullanın.