`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.
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 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:
- Üç alana sahip,
APIErroradlı özel bir hata türü oluşturun:Code(int) - HTTP durum koduField(string) - hataya neden olan alanMessage(string) - hatanın açıklaması
Error() stringiçin şu değeri döndürenAPIErroryöntemini uygulayın:"API error [code]: [message] (field: [field])"- İlk girdiyi virgüllere göre bölerek endpoint, method, hata kodu ve hata alanını elde edin
- İkinci girdiyi virgüllere göre bölerek hizmet adını ve istek kimliğini elde edin
- Hata kodu dizesini bir tamsayı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.Errorfile%wkullanarak endpoint düzeyinde sarmalanmış bir hata oluşturun:"[method] [endpoint] failed: %w"- Hizmet düzeyinde sarmalanmış bir hata oluşturun:
"[service_name] request [request_id] failed: %w" - Sarmalanmış hata zincirinden
errors.Asöğesini ayıklamak ve ayıklama sonucunu görüntülemek içinAPIErrorkullanın:- Ayıklama başarılıysa:
"API error extracted successfully" - Ayıklama başarısızsa:
"Failed to extract API error"
- Ayıklama başarılıysa:
- 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 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
}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ışlarKendi başına pratik yap: Online Go derleyicisi