errors.Is ve errors.As
- Go kursu
- Başlangıç
- Ders 85/90
- 4 dk
Hata sarmalama ve errors.Is, errors.As kullanımını öğrenirsin.
errors.Is ve errors.As
Sarılmış hatalar == ile karşılaştırılamaz çünkü dıştaki hata farklı bir değerdir. Zincirin içine bakmak için:
err := fmt.Errorf("profil: %w", ErrBulunamadi)
fmt.Println(err == ErrBulunamadi) // false
fmt.Println(errors.Is(err, ErrBulunamadi)) // true
var dh *DogrulamaHatasi
if errors.As(err, &dh) {
fmt.Println("alan:", dh.Alan)
}errors.Is belirli bir hata değerini, errors.As belirli bir hata türünü arar.
Doğru karşılaştırma
Kural: hata kontrolünde == yerine her zaman errors.Is kullan; böylece hata ileride sarılsa da kodun çalışmaya devam eder. Standart kütüphanede de bu böyledir: errors.Is(err, fs.ErrNotExist), errors.Is(err, context.DeadlineExceeded), errors.Is(err, sql.ErrNoRows).
Uygulama Zincirde ara
ErrYok := errors.New("yok") ve err := fmt.Errorf("katman 2: %w", fmt.Errorf("katman 1: %w", ErrYok)) oluştur. err == ErrYok ve errors.Is(err, ErrYok) sonuçlarını tek satırda yazdır.
Başlangıç kodu
package main
import (
"errors"
"fmt"
)
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"errors"
"fmt"
)
func main() {
ErrYok := errors.New("yok")
err := fmt.Errorf("katman 2: %w", fmt.Errorf("katman 1: %w", ErrYok))
fmt.Println(err == ErrYok, errors.Is(err, ErrYok))
}Beklenen çıktı
false true
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>errors.As</code>'a neden işaretçi (<code>&dh</code>) verilir?
- Bulunan hatayı o değişkene yazabilmesi için Doğru cevap
- Daha hızlı olduğu için
- Zorunlu değildir
- nil kontrolü için
Açıklama: As, zincirde istenen türü bulursa değeri hedef değişkene atar; bunun için hedefin adresi gerekir.
2 Türü ara
var dh *DogrulamaHatasi
if errors.____(err, &dh) {
fmt.Println(dh.Alan)
}
var dh *DogrulamaHatasi
if errors.As(err, &dh) {
fmt.Println(dh.Alan)
}
Açıklama: errors.As zincirde istenen türü bulur ve hedefe atar.
3 Soru ve araç
| Kavram | Anlamı |
|---|---|
Bu hata ErrX mi? |
errors.Is |
Bu hata *MyErr türünde mi? |
errors.As |
Bir kat aç |
errors.Unwrap |
err == ErrX |
Sarılınca bozulur |