Menu
Coddy logo textTech

`%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.

quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

challenge icon

Görev

Kolay

Uygulamanı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:

  1. Dosya adını, işlemi ve durumu almak için ilk girdiyi virgüllere göre ayırarak ayrıştırın
  2. Servis adını ve bileşeni almak için ikinci girdiyi virgüllere göre ayırarak ayrıştırın
  3. 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"
  4. %w ile fmt.Errorf kullanarak dosya düzeyinde sarmalanmış bir hata oluşturun: "failed to [operation] file [filename]: %w"
  5. Bileşen düzeyinde sarmalanmış bir hata oluşturun: "[component] error: %w"
  6. Servis düzeyinde sarmalanmış bir hata oluşturun: "[service_name] operation failed: %w"
  7. 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]"
  8. 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
	
}
quiz iconKendini test et

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