`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.
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
KolaySarmalanmış 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:
- Üç alana sahip
APIErrorstruct adında özel bir hata türü oluşturun:Code(int) - HTTP durum koduField(string) - hataya neden olan alanMessage(string) - hatanın açıklaması
APIErroriçin şu sonucu döndürenError() stringmetodunu uygulayın:"API error [code]: [message] (field: [field])"- Endpoint, method, hata kodu ve hata alanını almak için ilk girdiyi virgüllere göre ayırarak ayrıştırın
- Servis adı ve istek kimliğini almak için ikinci girdiyi virgüllere göre ayırarak ayrıştırın
- Hata kodu dizesini bir tam sayıya dönüştürün
- 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"
- Kod 400 ise: mesaj
fmt.Errorfve%wkullanarak endpoint düzeyinde sarmalanmış bir hata oluşturun:"[method] [endpoint] failed: %w"- Servis düzeyinde sarmalanmış bir hata oluşturun:
"[service_name] request [request_id] failed: %w" - Sarmalanmış hata zincirinden
APIError'ı ayıklamak içinerrors.Askullanı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"
- Ayıklama başarılı olursa:
- 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]"
- 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]"
- 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
}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