Menu
Coddy logo textTech

`errors.As` ile Sarmalı Açma

Coddy'nin GO Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 41 / 68.

errors.Is bir zincirdeki belirli hata değerlerini tanımlamanıza yardımcı olurken, bazen özel bir hata türünün gerçek alanlarına ve verilerine erişmeniz gerekir. errors.As işlevi, bir zincirde belirli bir türle eşleşen ilk hatayı bularak ve inceleme için onu ayıklayarak bu yeteneği sağlar.

errors.As fonksiyonu iki parametre alır: incelenecek hata ve hedef hata türündeki bir değişkene ait bir işaretçi. Zincirde eşleşen bir hata türü bulursa, değişkeninizi o hataya atar ve true değerini döndürür:

var validationErr ValidationError
if errors.As(wrappedErr, &validationErr) {
    fmt.Printf("Field: %s, Message: %s\n", validationErr.Field, validationErr.Message)
}

Bu, ek bağlam içeren özel hata türleriyle çalışırken özellikle güçlüdür. Yalnızca eşitliği kontrol eden errors.Is'in aksine, errors.As gerçek hata örneğini çıkararak alanlarına ve yöntemlerine erişmenize olanak tanır. Bu, karmaşık uygulamalarda hata yönetimini daha gelişmiş ve bilgilendirici hale getirir.

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

Sarmalanmış hata zincirlerinden özel hata türlerini ayıklamak ve incelemek için errors.As kullanan bir API hata işleme sistemi oluşturun. Bu zorluk, ek bağlamla sarmalanmış olsalar bile belirli özel hata türlerinin alanlarına ve verilerine erişmek için errors.As'in nasıl kullanılacağını gösterir.

İki girdi alacaksınız:

  • "endpoint,method,error_code,error_field" formatında API istek ayrıntılarını içeren bir dize (örneğin, "/users,POST,400,email")
  • "service_name,request_id" formatında sistem bağlamını içeren bir dize (örneğin, "UserAPI,req_12345")

Göreviniz şunları yapmaktır:

  1. Üç alana sahip APIError struct adında özel bir hata türü oluşturun:
    • Code (int) - HTTP durum kodu
    • Field (string) - hataya neden olan alan
    • Message (string) - hatanın açıklaması
  2. APIError için şu sonucu döndüren Error() string metodunu uygulayın: "API error [code]: [message] (field: [field])"
  3. Endpoint, method, hata kodu ve hata alanını almak için ilk girdiyi virgüllere göre ayırarak ayrıştırın
  4. Servis adı ve istek kimliğini almak için ikinci girdiyi virgüllere göre ayırarak ayrıştırın
  5. Hata kodu dizesini bir tam sayıya dönüştürün
  6. Hata koduna göre bir APIError örneği oluşturun:
    • Kod 400 ise: mesaj "invalid request data"
    • Kod 401 ise: mesaj "authentication required"
    • Kod 404 ise: mesaj "resource not found"
    • Kod 500 ise: mesaj "internal server error"
    • Diğer tüm kodlar için: mesaj "unknown error"
  7. fmt.Errorf ve %w kullanarak endpoint düzeyinde sarmalanmış bir hata oluşturun: "[method] [endpoint] failed: %w"
  8. Servis düzeyinde sarmalanmış bir hata oluşturun: "[service_name] request [request_id] failed: %w"
  9. Sarmalanmış hata zincirinden APIError'ı ayıklamak için errors.As kullanın ve ayıklama sonucunu görüntüleyin:
    • Ayıklama başarılı olursa: "API error extracted successfully"
    • Ayıklama başarısız olursa: "Failed to extract API error"
  10. Ayıklama başarılı olduysa, ayıklanan hata ayrıntılarını görüntüleyin:
    • "Extracted Error Details:"
    • "Code: [code]"
    • "Field: [field]"
    • "Message: [message]"
    • "Full error: [full_error_message_from_Error_method]"
  11. Tam hata zincirini görüntüleyin:
    • "Error Chain:"
    • "Original: [original_api_error_message]"
    • "Endpoint level: [endpoint_level_error_message]"
    • "Service level: [service_level_error_message]"
  12. Son bir analiz görüntüleyin:
    • "Error Analysis:"
    • "Service: [service_name]"
    • "Request ID: [request_id]"
    • "Endpoint: [method] [endpoint]"
    • "HTTP Status: [code]"
    • "Problem Field: [field]"
    • "Error Category: [error_category]"; burada error_category 400-499 arası kodlar için "Client Error", 500-599 arası kodlar için "Server Error" veya diğer kodlar için "Unknown" olmalıdır

Girdi dizelerini virgüllere göre ayırmak için strings paketini, hata kodu dizesini tam sayıya dönüştürmek için strconv paketini, errors.As için errors paketini ve hata sarmalama için fmt paketini kullanın. Bu zorluk, errors.As'in sarmalanmış hata zincirleri içindeki özel hata türlerinin belirli alanlarına ve metodlarına erişmenize nasıl olanak tanıdığını, gelişmiş hata işleme ve analizini nasıl mümkün kıldığını gösterir.

Kopya kağıdı

errors.As fonksiyonu, hata zincirlerinden belirli hata türlerini çıkararak özel hata alanlarına ve metotlarına erişim sağlar.

errors.As iki parametre alır: incelenecek hata ve hedef hata türündeki bir değişkenin işaretçisi (pointer):

var validationErr ValidationError
if errors.As(wrappedErr, &validationErr) {
    fmt.Printf("Field: %s, Message: %s\n", validationErr.Field, validationErr.Message)
}

Sadece eşitliği kontrol eden errors.Is'in aksine, errors.As gerçek hata örneğini çıkararak daha gelişmiş hata yönetimi için alanlarına ve metotlarına erişim sağlar.

Kendin dene

package main

import (
	"errors"
	"fmt"
	"strconv"
	"strings"
)

func main() {
	// Girdiyi oku
	var apiDetails string
	var systemContext string
	fmt.Scanln(&apiDetails)
	fmt.Scanln(&systemContext)
	
	// Girdileri ayrıştır
	apiParts := strings.Split(apiDetails, ",")
	endpoint := apiParts[0]
	method := apiParts[1]
	errorCodeStr := apiParts[2]
	errorField := apiParts[3]
	
	contextParts := strings.Split(systemContext, ",")
	serviceName := contextParts[0]
	requestID := contextParts[1]
	
	// Hata kodunu tam sayıya dönüştür
	errorCode, _ := strconv.Atoi(errorCodeStr)
	
	// TODO: Kodunuzu aşağıya yazın
	// 1. Code, Field, Message alanlarını içeren APIError yapısını (struct) oluşturun
	// 2. APIError için Error() metodunu uygulayın
	// 3. Hata koduna göre APIError örneği oluşturun
	// 4. Sarmalanmış hatalar oluşturun (uç nokta seviyesi ve servis seviyesi)
	// 5. Sarmalanmış hata zincirinden APIError'ı çıkarmak için errors.As kullanın
	// 6. Çıkarma sonucunu ve hata detaylarını görüntüleyin
	// 7. Hata zincirini ve nihai analizi görüntüleyin
	
}
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