Menu
Coddy logo textTech

`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.

quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

challenge icon

Görev

Kolay

Sarmalanmış 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:

  1. errors.New() kullanarak üç sentinel hatası tanımlayın:
    • "connection timeout" mesajıyla ErrConnectionTimeout
    • "connection refused" mesajıyla ErrConnectionRefused
    • "database not found" mesajıyla ErrDatabaseNotFound
  2. 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
  3. Servis adını ve deneme sayısını almak için ikinci girdiyi virgüllere göre ayırarak ayrıştırın
  4. Hata türüne göre orijinal hatayı oluşturun:
    • Hata türü "connection_timeout" ise: ErrConnectionTimeout kullanın
    • Hata türü "connection_refused" ise: ErrConnectionRefused kullanın
    • Hata türü "database_not_found" ise: ErrDatabaseNotFound kullanın
    • Diğer tüm hata türleri için: errors.New("unknown database error") kullanın
  5. %w ile fmt.Errorf kullanarak veritabanı düzeyinde sarmalanmış bir hata oluşturun: "failed to [operation] database [database_name]: %w"
  6. Servis düzeyinde sarmalanmış bir hata oluşturun: "[service_name] database operation failed after [retry_count] retries: %w"
  7. Nihai sarmalanmış hatanın her bir sentinel hatasıyla eşleşip eşleşmediğini kontrol etmek için errors.Is kullanı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]"
  8. Hata zincirini görüntüleyin:
    • "Error Chain:"
    • "Original: [original_error_message]"
    • "Database level: [database_level_error_message]"
    • "Service level: [service_level_error_message]"
  9. 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
	
}
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