0Pricing
Go Academy · Ders

Özel Hatalar Oluşturma

errors.New, fmt.Errorf ve nöbetçi hatalar

Özel Hatalar Oluşturma, CoddyKit'te ücretsiz bir Go Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Go Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Go Academy kursu toplamda 4 dersten oluşur.

Özel Hata Türleri Neden Kullanılır?

Özel hata türleri, dize iletisinin ötesinde yapılandırılmış veriler taşır. Böylece çağıranlar belirli hata koşullarını inceleyip bunlara tepki verebilir:

package main
import "fmt"

// Custom error type carries extra context
type HTTPError struct {
    StatusCode int
    Message    string
}

func (e *HTTPError) Error() string {
    return fmt.Sprintf("HTTP %d: %s", e.StatusCode, e.Message)
}

func fetch(url string) error {
    return &HTTPError{404, "page not found"}
}

func main() {
    err := fetch("http://example.com")
    fmt.Println(err) // HTTP 404: page not found
}

error Arayüzünü Uygulama

Error() string yöntemine sahip her tür error arayüzünü karşılar:

package main
import "fmt"

type ValidationError struct {
    Field   string
    Value   interface{}
    Message string
}

func (e *ValidationError) Error() string {
    return fmt.Sprintf("validation: field %q value %v — %s", e.Field, e.Value, e.Message)
}

func validateAge(age int) error {
    if age < 0 || age > 150 {
        return &ValidationError{"age", age, "must be between 0 and 150"}
    }
    return nil
}

func main() {
    fmt.Println(validateAge(-5))
}

errors.New ile Önceden Tanımlı Hatalar

Önceden tanımlı hatalar, iyi bilinen hata koşulları için paket düzeyinde değişkenlerdir:

package main
import ("fmt"; "errors")

var (
    ErrNotFound      = errors.New("not found")
    ErrUnauthorized  = errors.New("unauthorized")
    ErrAlreadyExists = errors.New("already exists")
)

func getUser(id int) (string, error) {
    if id != 1 { return "", ErrNotFound }
    return "Alice", nil
}

func main() {
    _, err := getUser(99)
    if errors.Is(err, ErrNotFound) {
        fmt.Println("user does not exist")
    }
}

Sarmalama İçin %w ile fmt.Errorf

%w ile kullanılan fmt.Errorf bir hatayı sarar ve errors.Is ile errors.As için özgün hatayı korur:

package main
import ("fmt"; "errors")

var ErrDatabase = errors.New("database error")

func queryDB() error {
    return fmt.Errorf("queryDB: %w", ErrDatabase)
}

func main() {
    err := queryDB()
    fmt.Println(err)                       // queryDB: database error
    fmt.Println(errors.Is(err, ErrDatabase)) // true — unwrapped
}

Unwrap ile Özel Hata

Hata zincirlerine katılmak için özel hata türünüzde Unwrap() error uygulayın:

package main
import ("fmt"; "errors")

var ErrNotFound = errors.New("not found")

type QueryError struct {
    Query string
    Err   error
}

func (e *QueryError) Error() string {
    return fmt.Sprintf("query %q: %v", e.Query, e.Err)
}
func (e *QueryError) Unwrap() error { return e.Err }

func main() {
    err := &QueryError{"SELECT *", ErrNotFound}
    fmt.Println(err)
    fmt.Println(errors.Is(err, ErrNotFound)) // true
}

errors.Is — Özdeşlik Denetimi

errors.Is, hedefe eşit bir hata arayarak hata zincirinde ilerler:

package main
import ("fmt"; "errors")

var ErrTimeout = errors.New("timeout")

func deepCall() error {
    return fmt.Errorf("layer3: %w", fmt.Errorf("layer2: %w", ErrTimeout))
}

func main() {
    err := deepCall()
    fmt.Println(errors.Is(err, ErrTimeout)) // true — found deep in chain
}

errors.As — Tür Çıkarma

errors.As, hedef türle eşleşen ilk hatayı zincirde bulur ve ona atama yapar:

package main
import ("fmt"; "errors")

type PermissionError struct{ User string }
func (e *PermissionError) Error() string { return "permission denied for " + e.User }

func action(user string) error {
    return fmt.Errorf("action: %w", &PermissionError{user})
}

func main() {
    err := action("bob")
    var pe *PermissionError
    if errors.As(err, &pe) {
        fmt.Println("denied:", pe.User) // denied: bob
    }
}

Birden Çok Hatanın Sarmalanması (Go 1.20+)

Go 1.20, hataları birleştirmek için errors.Join işlevini ve birden çok %w içeren fmt.Errorf kullanımını ekledi:

package main
import ("fmt"; "errors")

func validate(name, email string) error {
    var errs []error
    if name == ""  { errs = append(errs, errors.New("name required")) }
    if email == "" { errs = append(errs, errors.New("email required")) }
    return errors.Join(errs...)
}

func main() {
    err := validate("", "")
    fmt.Println(err)
    // name required
    // email required
}

Hata Türü Adlandırma Kuralları

Go'da hata değişkenleri ve türleri için kurallar:

  • Önceden tanımlı hata değişkenleri: ErrXxx (ör. ErrNotFound)
  • Özel hata türleri: XxxError (ör. ValidationError)
  • Önceden tanımlı hata için paket düzeyinde var, zengin verili hatalar için işaretçi türü kullanın
  • Çağıranların errors.Is / errors.As içinde kullanabilmesi için dışa aktarın

Her Yaklaşım Ne Zaman Kullanılmalı

Doğru hata yaklaşımını seçme:

  • errors.New — basit, ek veri içermeyen hatalar ve önceden tanımlı hata özdeşliği denetimi
  • fmt.Errorf — isteğe bağlı sarmalamaya sahip biçimlendirilmiş ileti
  • Özel tür — çağıranın yapılandırılmış verilere (alanlar, kodlar) ihtiyaç duyduğu durumlar
  • errors.Join — birden çok doğrulama hatasını bir araya getirme

Hızlı Kontrol

Bir hata zincirinden belirli bir hata türünün çıkarılmasını hangi işlev sağlar?

Özet: Özel Hatalar

Özet:

  • Özel hata türleri oluşturmak için Error() string uygulayın
  • Hata zincirlerine katılmak için Unwrap() error ekleyin
  • Özdeşlik denetimleri için errors.Is, tür çıkarma için errors.As kullanın
  • Önceden tanımlı hatalar: ErrXxx; özel türler: XxxError
  • errors.Join, birden çok hatayı bir araya getirir (Go 1.20+)

Sıkça Sorulan Sorular

“Özel Hatalar Oluşturma” dersi ücretsiz mi?

Evet — “Özel Hatalar Oluşturma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Go Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Go Academy kursu toplamda 4 dersten oluşur.

“Özel Hatalar Oluşturma” dersinde ne öğreneceğim?

errors.New, fmt.Errorf ve nöbetçi hatalar Go Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Go Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Go Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“Özel Hatalar Oluşturma” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Go Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Go Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. error Arayüzü
  2. Özel Hatalar Oluşturma
  3. Hataları Sarma ve Açma
  4. panic, recover ve defer
← Go Academy Sayfasına Dön