`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.
sarılmış hatalarla çalışırken, hata zincirinin herhangi bir yerinde belirli bir hatanın bulunup bulunmadığını kontrol etmenin bir yoluna ihtiyacın vardır. errors.Is işlevi tam olarak bu olanağı sağlar ve sentinel hataları birden çok kez sarılmış olsalar bile tanımlamana 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.
Görev
KolaySarmalanmış hata zincirlerindeki belirli bağlantı hatalarını tanımlamak için errors.Is kullanan bir veritabanı bağlantısı izleme sistemi oluşturun. Bu görev, birden çok uygulama katmanı üzerinden ek bağlamla sarmalanmış olsalar bile sentinel hataları algılamak için errors.Is kullanımını gösterir.
İki girdi alacaksınız:
"database_name,operation,error_type"biçiminde veritabanı işlemi ayrıntılarını içeren bir dize (ör."users_db,connect,connection_timeout")"service_name,retry_count"biçiminde uygulama bağlamını içeren bir dize (ör."AuthService,3")
Göreviniz:
errors.New()kullanarak üç sentinel hatası tanımlayın:ErrConnectionTimeout—"connection timeout"iletisiyleErrConnectionRefused—"connection refused"iletisiyleErrDatabaseNotFound—"database not found"iletisiyle
- Veritabanı adını, işlemi ve hata türünü elde etmek için ilk girdiyi virgüllere göre bölerek ayrıştırın
- Hizmet adını ve yeniden deneme sayısını elde etmek için ikinci girdiyi virgüllere göre bölerek ayrıştırın
- Hata türüne göre özgün 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ü
fmt.Errorfile%wkullanarak veritabanı düzeyinde sarmalanmış bir hata oluşturun:"failed to [operation] database [database_name]: %w"- Hizmet düzeyinde sarmalanmış bir hata oluşturun:
"[service_name] database operation failed after [retry_count] retries: %w" - Son sarmalanmış hatanın her bir sentinel hatasıyla eşleşip eşleşmediğini denetlemek ve sonuçları görüntülemek için
errors.Iskullanın:"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, "Connection Timeout", "Connection Refused", "Database Not Found" veya "Unknown Error" değerlerinden biri olmalıdır
Girdi dizelerini virgüllere göre bölmek için strings paketini, sentinel hataları ve errors için errors.Is paketini, hata sarmalama için de fmt paketini kullanın. Bu görev, errors.Is işlevinin sarmalanmış hatalarla doğru şekilde çalışan sağlam hata tanımlama olanağı sunduğunu ve bunun karmaşık uygulamalarda güvenilir hata yönetimi için vazgeçilmez olduğunu gösterir.
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ışlarKendi başına pratik yap: Online Go derleyicisi