Ö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.Asiç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 denetimifmt.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() stringuygulayın - Hata zincirlerine katılmak için
Unwrap() errorekleyin - Özdeşlik denetimleri için
errors.Is, tür çıkarma içinerrors.Askullanı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
- error Arayüzü
- Özel Hatalar Oluşturma
- Hataları Sarma ve Açma
- panic, recover ve defer