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.

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 görev, ek bağlamla sarmalanmış olsalar bile belirli özel hata türlerinin alanlarına ve verilerine erişmek için errors.As yönteminin nasıl kullanılacağını gösterir.

İki girdi alacaksınız:

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

Göreviniz:

  1. Üç alana sahip, APIError adlı ö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. Error() string için şu değeri döndüren APIError yöntemini uygulayın: "API error [code]: [message] (field: [field])"
  3. İlk girdiyi virgüllere göre bölerek endpoint, method, hata kodu ve hata alanını elde edin
  4. İkinci girdiyi virgüllere göre bölerek hizmet adını ve istek kimliğini elde edin
  5. Hata kodu dizesini bir tamsayı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 ile %w kullanarak endpoint düzeyinde sarmalanmış bir hata oluşturun: "[method] [endpoint] failed: %w"
  8. Hizmet düzeyinde sarmalanmış bir hata oluşturun: "[service_name] request [request_id] failed: %w"
  9. Sarmalanmış hata zincirinden errors.As öğesini ayıklamak ve ayıklama sonucunu görüntülemek için APIError kullanın:
    • Ayıklama başarılıysa: "API error extracted successfully"
    • Ayıklama başarısızsa: "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 kodları için "Client Error", 500-599 kodları için "Server Error", diğer kodlar için "Unknown" olur

Girdi dizelerini virgüllere göre bölmek için strings paketini, hata kodu dizesini bir tamsayıya dönüştürmek için strconv paketini, errors için errors.As paketini ve hataları sarmalamak için fmt paketini kullanın. Bu görev, errors.As yönteminin sarmalanmış hata zincirleri içindeki özel hata türlerinin belirli alanlarına ve yöntemlerine erişmenize nasıl olanak tanıdığını; böylece gelişmiş hata işleme ve analiz gerçekleştirebildiğinizi gösterir.

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

Kendi başına pratik yap: Online Go derleyicisi