`errors.Is` ile Sarmalı Açma
Coddy'nin GO Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 40 / 68.
Sarmalanmış hatalarla çalışırken, hata zincirinin herhangi bir yerinde belirli bir hatanın mevcut olup olmadığını kontrol etmenin bir yoluna ihtiyacınız vardır. errors.Is fonksiyonu tam olarak bu yeteneği sağlar ve sentinel hataları birden çok kez sarmalanmış olsalar bile tanımlamanıza olanak tanır.
errors.Is fonksiyonu iki parametre alır: incelemek istediğiniz hata ve aradığınız hedef hata. Eğer hedef hata, hata zincirinin herhangi bir yerinde bulunursa true değerini döndürür:
var ErrNotFound = errors.New("not found")
wrappedErr := fmt.Errorf("failed to load user: %w", ErrNotFound)
if errors.Is(wrappedErr, ErrNotFound) {
fmt.Println("This is a not found error")
}Bu, Go'da belirli hataları kontrol etmenin modern ve önerilen yoludur. Dize karşılaştırması veya doğrudan eşitlik kontrollerinin aksine, errors.Is sarmalanmış hatalarla doğru şekilde çalışır ve eşleşmeleri bulmak için hata zincirini takip eder. Bu, hatalar uygulamanızın birden fazla katmanından geçse bile hata yönetiminizi sağlam ve güvenilir 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 zincirlerindeki belirli bağlantı hatalarını tanımlamak için errors.Is kullanan bir veritabanı bağlantı izleme sistemi oluşturun. Bu görev, sentinel hataların birden fazla uygulama katmanı aracılığıyla ek bağlamla sarmalanmış olsalar bile bunları tespit etmek için errors.Is'in nasıl kullanılacağını gösterir.
İki girdi alacaksınız:
"database_name,operation,error_type"formatında veritabanı işlem ayrıntılarını içeren bir dize (örneğin,"users_db,connect,connection_timeout")"service_name,retry_count"formatında uygulama bağlamını içeren bir dize (örneğin,"AuthService,3")
Göreviniz şunları yapmaktır:
errors.New()kullanarak üç sentinel hatası tanımlayın:"connection timeout"mesajıylaErrConnectionTimeout"connection refused"mesajıylaErrConnectionRefused"database not found"mesajıylaErrDatabaseNotFound
- Veritabanı adını, işlemi ve hata türünü almak için ilk girdiyi virgüllere göre ayırarak ayrıştırın
- Servis adını ve deneme sayısını almak için ikinci girdiyi virgüllere göre ayırarak ayrıştırın
- Hata türüne göre orijinal hatayı oluşturun:
- Hata türü
"connection_timeout"ise:ErrConnectionTimeoutkullanın - Hata türü
"connection_refused"ise:ErrConnectionRefusedkullanın - Hata türü
"database_not_found"ise:ErrDatabaseNotFoundkullanın - Diğer tüm hata türleri için:
errors.New("unknown database error")kullanın
- Hata türü
%wilefmt.Errorfkullanarak veritabanı düzeyinde sarmalanmış bir hata oluşturun:"failed to [operation] database [database_name]: %w"- Servis düzeyinde sarmalanmış bir hata oluşturun:
"[service_name] database operation failed after [retry_count] retries: %w" - Nihai sarmalanmış hatanın her bir sentinel hatasıyla eşleşip eşleşmediğini kontrol etmek için
errors.Iskullanın ve sonuçları görüntüleyin:"Checking for connection timeout: [true/false]""Checking for connection refused: [true/false]""Checking for database not found: [true/false]"
- Hata zincirini görüntüleyin:
"Error Chain:""Original: [original_error_message]""Database level: [database_level_error_message]""Service level: [service_level_error_message]"
- Hata analizini görüntüleyin:
"Error Analysis:""Database: [database_name]""Operation: [operation]""Service: [service_name]""Retries: [retry_count]""Error type detected: [detected_error_type]"; burada detected_error_type şunlardan biridir: "Connection Timeout", "Connection Refused", "Database Not Found" veya "Unknown Error"
Girdi dizelerini virgüllere göre ayırmak için strings paketini, sentinel hatalar ve errors.Is için errors paketini ve hata sarmalama için fmt paketini kullanın. Bu görev, errors.Is'in sarmalanmış hatalarla doğru şekilde çalışan sağlam hata tanımlama sağladığını ve bunun karmaşık uygulamalarda güvenilir hata yönetimi için neden gerekli olduğunu göstermektedir.
Kopya kağıdı
errors.Is fonksiyonu, bir hata zincirinin herhangi bir yerinde belirli bir hatanın mevcut olup olmadığını, birden fazla kez sarmalanmış olsa bile kontrol eder:
var ErrNotFound = errors.New("not found")
wrappedErr := fmt.Errorf("failed to load user: %w", ErrNotFound)
if errors.Is(wrappedErr, ErrNotFound) {
fmt.Println("This is a not found error")
}errors.Is iki parametre alır: incelenecek hata ve bulunacak hedef hata. Hedef hata, hata zincirinin herhangi bir yerinde bulunursa true döner.
Bu, dize karşılaştırması veya doğrudan eşitlik kontrollerinin aksine, sarmalanmış hatalarla doğru şekilde çalıştığı için Go'da belirli hataları kontrol etmenin modern ve önerilen yoludur.
Kendin dene
package main
import (
"errors"
"fmt"
"strings"
)
func main() {
// Girdiyi oku
var dbOperation string
var appContext string
fmt.Scanln(&dbOperation)
fmt.Scanln(&appContext)
// Girdileri ayrıştır
dbParts := strings.Split(dbOperation, ",")
databaseName := dbParts[0]
operation := dbParts[1]
errorType := dbParts[2]
contextParts := strings.Split(appContext, ",")
serviceName := contextParts[0]
retryCount := contextParts[1]
// YAPILACAK: Kodunuzu aşağıya yazın
// 1. errors.New() kullanarak üç sentinel hatayı tanımlayın
// 2. Hata türüne göre orijinal hatayı oluşturun
// 3. %w ile fmt.Errorf kullanarak veritabanı düzeyinde sarmalanmış hata oluşturun
// 4. Servis düzeyinde sarmalanmış hata oluşturun
// 5. Her bir sentinel hatayı kontrol etmek için errors.Is kullanın
// 6. Sonuçları ve hata zincirini 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