`%w` ile Hataları Sarmalama
Coddy'nin GO Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 39 / 68.
Uygulamanızda hatalar oluştuğunda, kodunuzun farklı katmanlarından yukarı doğru ilerlerken genellikle ek bağlama ihtiyaç duyarlar. Go, fmt.Errorf ile %w format belirtecini kullanarak hata sarmalama (error wrapping) yoluyla bunun için güçlü bir mekanizma sağlar.
Hata sarmalama (error wrapping), alttaki orijinal hatayı korurken mevcut bir hataya bağlamsal bilgiler eklemenize olanak tanır. Bu, neyin yanlış gittiğinin tam geçmişini tutan bir hata zinciri oluşturur:
originalErr := errors.New("file not found")
wrappedErr := fmt.Errorf("failed to load config: %w", originalErr)%w belirteci özeldir - fmt.Errorf fonksiyonuna hatayı sadece bir dizeye dönüştürmek yerine sarmalamasını (wrap) söyler. Bu, orijinal hatayı korur; böylece daha sonra errors.Is ve errors.As gibi fonksiyonlar kullanılarak incelenebilir.
Bu desen, bir hatanın her biri kendi bağlamını ekleyen birden fazla fonksiyondan geçebildiği büyük uygulamalarda özellikle değerlidir. Örneğin, bir veritabanı bağlantı hatası "failed to connect to database" ile sarmalanabilir, ardından "unable to start server" ile tekrar sarmalanarak neyin nerede gerçekleştiğine dair net bir iz oluşturabilir.
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Görev
KolayUygulamanızın farklı katmanlarından geçerken hataları bağlamsal bilgilerle sarmalayan bir dosya işleme sistemi oluşturun. Bu görev, anlamlı bağlam eklerken orijinal hatayı koruyan hata zincirleri oluşturmak için fmt.Errorf ile %w biçim belirtecinin nasıl kullanılacağını gösterir.
İki girdi alacaksınız:
"filename,operation,status"formatında dosya işlem ayrıntılarını içeren bir dize (örneğin,"config.json,read,permission_denied")"service_name,component"formatında sistem bağlamını içeren bir dize (örneğin,"UserService,ConfigLoader")
Göreviniz şunları yapmaktır:
- Dosya adını, işlemi ve durumu almak için ilk girdiyi virgüllere göre ayırarak ayrıştırın
- Servis adını ve bileşeni almak için ikinci girdiyi virgüllere göre ayırarak ayrıştırın
errors.New()kullanarak duruma göre orijinal bir hata oluşturun:- Eğer durum
"permission_denied"ise:"permission denied" - Eğer durum
"not_found"ise:"file not found" - Eğer durum
"corrupted"ise:"file corrupted" - Diğer tüm durumlar için:
"unknown error"
- Eğer durum
%wilefmt.Errorfkullanarak dosya düzeyinde sarmalanmış bir hata oluşturun:"failed to [operation] file [filename]: %w"- Bileşen düzeyinde sarmalanmış bir hata oluşturun:
"[component] error: %w" - Servis düzeyinde sarmalanmış bir hata oluşturun:
"[service_name] operation failed: %w" - Her seviyeyi yazdırarak hata zincirini görüntüleyin:
"Original error: [original_error_message]""File level: [file_level_error_message]""Component level: [component_level_error_message]""Service level: [service_level_error_message]"
- Hata zincirinin bir özetini görüntüleyin:
"Error Chain Summary:""File: [filename]""Operation: [operation]""Component: [component]""Service: [service_name]""Root cause: [original_error_message]"
Girdi dizelerini virgüllere göre ayırmak için strings paketini, orijinal hatayı oluşturmak için errors paketini ve sarmalanmış hataları oluşturmak için fmt paketini kullanın. Bu görev, %w ile hata sarmalamanın, hatalar uygulamanızın farklı katmanlarından geçerken nasıl net bir bağlam izi oluşturduğunu ve hata ayıklamayı çok daha etkili hale getirdiğini gösterir.
Kopya kağıdı
Hata sarmalama (error wrapping), orijinal hatayı korurken mevcut bir hataya bağlamsal bilgiler eklemenize olanak tanır. fmt.Errorf ile %w format belirtecini kullanın:
originalErr := errors.New("file not found")
wrappedErr := fmt.Errorf("failed to load config: %w", originalErr)%w belirteci, orijinal hatayı korur; böylece hata daha sonra errors.Is ve errors.As gibi fonksiyonlar kullanılarak incelenebilir. Bu, neyin yanlış gittiğine dair tam geçmişi tutan bir hata zinciri oluşturur; bu da hataların büyük uygulamalarda birden fazla fonksiyondan geçtiği durumlarda oldukça değerlidir.
Kendin dene
package main
import (
"errors"
"fmt"
"strings"
)
func main() {
// Girdiyi oku
var fileDetails string
var systemContext string
fmt.Scanln(&fileDetails)
fmt.Scanln(&systemContext)
// Girdileri ayrıştır
fileInfo := strings.Split(fileDetails, ",")
filename := fileInfo[0]
operation := fileInfo[1]
status := fileInfo[2]
contextInfo := strings.Split(systemContext, ",")
serviceName := contextInfo[0]
component := contextInfo[1]
// TODO: Kodunuzu aşağıya yazın
// Duruma göre orijinal hatayı oluşturun
// Dosya düzeyinde sarmalanmış hata oluşturun
// Bileşen düzeyinde sarmalanmış hata oluşturun
// Servis düzeyinde sarmalanmış hata oluşturun
// Her bir hata düzeyini ve özetini yazdırın
}Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Mantık ve Akış bölümündeki tüm dersler
1İleri Seviye Kontrol Akışı
`fallthrough` ile Switchİç İçe Döngülerden ÇıkmaBelirli Bir Döngüye Devam Etme`goto` İfadesiÖzet - İleri Seviye Döngü Kontrolü4Proje: Basit Görev Listesi
Proje KurulumuGörev Ekleme7Derinlemesine Hata Yönetimi
Özel Hata Türleri`%w` ile Hataları Sarmalama`errors.Is` ile Sarmalı Açma`errors.As` ile Sarmalı Açma`panic` Kavramını Anlamak`recover` KullanımıÖzet - Güvenli Bölme2Structlar ve Metotlar
Structlarda Metot TanımlamaValue Receiver'larPointer Receiver'larReceiver SeçimiMetotlar ve FonksiyonlarÖzet - Struct Davranışı5Derinlemesine Map'ler
Struct Map'leriMap Değeri Olarak Pointer'larNil Map KontrolüMap'leri KarşılaştırmaÖzet - Kelime Frekansı Sayacı3Arayüzler (Temeller)
Arayüz Nedir?Bir Arayüz TanımlamaBir Arayüzü UygulamaArayüz Tiplerini KullanmaBoş ArayüzTip OnaylamalarıTip SeçimiÖzet - Şekiller ve Davranışlar