CodeBlanks Logo Icon CodeBlanks

errors.Is ve errors.As

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

main.go
package main

import (
    "errors"
    "fmt"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
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>&amp;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

Soru
var dh *DogrulamaHatasi
if errors.____(err, &dh) {
    fmt.Println(dh.Alan)
}
Cevap
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

Başlangıç bölümündeki tüm dersler