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.
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ı
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:
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:
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
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
v, err := op()
if err != nil {
return fmt.Errorf("op fallita per %q: %w", id, err)
}Deyimler:
err != nilhemen 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/Asile ayrım yapın.
Deneyin
Error() dizesini *ErrNotFound'a uygulayın, böylece 'non trovato: <Key>' değerini döndürür.
İpucu göster
`fmt.Println(err)` yapınızdaki Error() yöntemini otomatik olarak çağırır.
3 denemeden sonra çözüm mevcut
Hataları kullanın. Hatanın nöbetçi ErrVuoto'ya eşit olup olmadığını kontrol etmek için.
İpucu göster
`errors.Is(err, target)` sarma zincirlerinde bile sağlamdır.
3 denemeden sonra çözüm mevcut
Hatayı uygulama yönteminin tam imzası nedir?
func (e *MyErr) ??? {}Ö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%wkullanın.