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.

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.

challenge icon

Görev

Kolay

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

  1. errors.New() kullanarak üç sentinel hatası tanımlayın:
    • ErrConnectionTimeout"connection timeout" iletisiyle
    • ErrConnectionRefused"connection refused" iletisiyle
    • ErrDatabaseNotFound"database not found" iletisiyle
  2. 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
  3. 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
  4. Hata türüne göre özgün 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. fmt.Errorf ile %w kullanarak veritabanı düzeyinde sarmalanmış bir hata oluşturun: "failed to [operation] database [database_name]: %w"
  6. Hizmet düzeyinde sarmalanmış bir hata oluşturun: "[service_name] database operation failed after [retry_count] retries: %w"
  7. 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.Is kullanın:
    • "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, "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
	
}
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

Kendi başına pratik yap: Online Go derleyicisi