fmt.Errorf
- Go kursu
- Orta seviye
- Ders 56/80
- 4 dk
Errorf ile biçimli hata oluşturmayı öğrenirsin.
fmt.Errorf
fmt.Errorf biçimli bir hata oluşturur. %w verb'i alttaki hatayı sarar: mesaja bağlam eklenir ama asıl hata kaybolmaz.
f, err := os.Open(yol)
if err != nil {
return fmt.Errorf("ayar okunamadı (%s): %w", yol, err)
}Çağıran taraf errors.Is(err, fs.ErrNotExist) ile asıl nedeni yine sorgulayabilir. %v kullanılsaydı yalnızca metin kopyalanır, zincir kopardı.
errors.As ve özel hatalar
Hata türüne göre karar vermek için errors.As zincirde belirli bir türü arar:
type DogrulamaHatasi struct{ Alan string }
func (e *DogrulamaHatasi) Error() string { return e.Alan + " geçersiz" }
err := fmt.Errorf("kayıt: %w", &DogrulamaHatasi{"eposta"})
var dh *DogrulamaHatasi
if errors.As(err, &dh) {
fmt.Println(dh.Alan) // eposta
}Go 1.20'den beri tek Errorf içinde birden çok %w kullanılabilir.
Uygulama Sarılmış hata
var ErrYok = errors.New("kayıt yok") tanımla. bul(id int) error fonksiyonu fmt.Errorf("bul %d: %w", id, ErrYok) döndürsün. Hatayı ve errors.Is(err, ErrYok) sonucunu ayrı satırlarda yazdır.
Başlangıç kodu
package main
import (
"errors"
"fmt"
)
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"errors"
"fmt"
)
var ErrYok = errors.New("kayıt yok")
func bul(id int) error {
return fmt.Errorf("bul %d: %w", id, ErrYok)
}
func main() {
err := bul(7)
fmt.Println(err)
fmt.Println(errors.Is(err, ErrYok))
}Beklenen çıktı
bul 7: kayıt yok true
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>%w</code> yerine <code>%v</code> ile sarılan hatada <code>errors.Is</code> ne döner?
- false; zincir kopmuştur Doğru cevap
- true
- panic
- nil
Açıklama: %v yalnızca mesajı metne çevirir; Unwrap yöntemi olmadığı için errors.Is asıl hataya ulaşamaz.
2 Hatayı sar
return fmt.Errorf("bağlantı kurulamadı: ____", err)
return fmt.Errorf("bağlantı kurulamadı: %w", err)
Açıklama: %w hatayı sarar; errors.Is ve errors.As zincirde ona ulaşabilir.
3 Fonksiyon ve görevi
| Kavram | Anlamı |
|---|---|
fmt.Errorf + %w |
Bağlamla sar |
errors.Is |
Belirli hata mı? |
errors.As |
Belirli tür mü? |
errors.Unwrap |
Bir kat aç |