Menu
Coddy logo textTech

`recover` Kullanımı

Coddy'nin GO Journey'sinin Mantık ve Akış bölümünün bir parçası. Ders 43 / 68.

panic programınızı anında durdururken, Go recover fonksiyonu aracılığıyla kontrolü yeniden ele almanın bir yolunu sunar. recover fonksiyonu, bir paniği yakalamanıza ve onu zarif bir şekilde yönetmenize olanak tanıyarak tüm programınızın çökmesini engeller.

Ancak, recover çok özel bir gereksinime sahiptir: yalnızca ertelenmiş bir işlevin içinde kullanılabilir. Bir panik meydana geldiğinde Go, program sonlanmadan önce ertelenmiş tüm işlevleri çalıştırır ve recover işlevine paniği yakalama fırsatı verir:

func riskyFunction() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered from panic:", r)
        }
    }()
    
    panic("something went wrong!")
}

recover fonksiyonu, panic fonksiyonuna geçirilen değeri veya bir panik oluşmadıysa nil değerini döndürür. Bu, bir paniğin oluşup oluşmadığını kontrol etmenize ve hatayı günlüğe kaydetmek veya temizleme işlemlerini gerçekleştirmek gibi uygun eylemleri gerçekleştirmenize olanak tanır.

panic gibi, recover da Go'da idareli kullanılmalıdır. En yaygın olarak, tek bir isteğin neden olduğu paniğin tüm sunucuyu çökertmesini önlemek ve sunucunun diğer isteklere hizmet vermeye devam etmesini sağlamak istediğiniz web sunucuları gibi senaryolarda görülür.

challenge icon

Görev

Kolay

Panikleri zarif bir şekilde ele almak ve tüm sunucunun çökmesini önlemek için recover kullanan bir web sunucusu istek işleyicisi oluştur. Bu görev, panikleri yakalamak ve sunucu kararlılığını korumak için ertelenmiş bir işlev içinde recover kullanımını gösterir.

İki girdi alacaksın:

  • "endpoint,method,action" biçiminde istek ayrıntılarını içeren bir dize (ör. "/api/users,GET,process")
  • "server_name,max_requests" biçiminde sunucu yapılandırmasını içeren bir dize (ör. "WebServer,100")

Görevin:

  1. Endpoint, method ve action değerlerini elde etmek için ilk girdiyi virgüllere göre böl
  2. Sunucu adını ve maksimum istek sayısını elde etmek için ikinci girdiyi virgüllere göre böl
  3. Maksimum istek sayısı dizesini bir tamsayıya dönüştür
  4. Endpoint, method, action ve sunucu adını parametre olarak alan handleRequest adlı bir işlev oluştur
  5. handleRequest içinde, panikleri yakalamak için recover kullanan ertelenmiş bir işlev ekle:
    • Bir panik kurtarılırsa (recover nil olmayan bir değer döndürürse) şunu yazdır: "Server [server_name] recovered from panic: [panic_value]"
    • Paniki ele aldıktan sonra şunu yazdır: "Request handling completed safely"
  6. Ertelenmiş işlevden sonra, action değerine göre istek işlemeyi simüle et:
    • Action "process" ise: "Processing [method] request to [endpoint]" yazdır
    • Action "panic_nil" ise: "Attempting dangerous operation" yazdır, ardından panic("nil pointer access") çağır
    • Action "panic_overflow" ise: "Attempting resource allocation" yazdır, ardından panic("memory overflow") çağır
    • Action "panic_timeout" ise: "Attempting database connection" yazdır, ardından panic("connection timeout") çağır
    • Diğer tüm action değerleri için: "Unknown action: [action]" yazdır, ardından panic("invalid action") çağır
  7. Main işlevinde, sunucu başlatma mesajını yazdır: "Starting [server_name] with max [max_requests] requests"
  8. Ayrıştırılmış parametrelerle handleRequest işlevini çağır
  9. İşlev çağrısından sonra sunucu durumunu yazdır: "Server [server_name] is still running"
  10. Son olarak bir özet yazdır:
    • "Server Summary:"
    • "Name: [server_name]"
    • "Max Requests: [max_requests]"
    • "Last Request: [method] [endpoint]"
    • "Action Performed: [action]"
    • "Status: Operational"

Girdi dizelerini virgüllere göre bölmek için strings paketini, maksimum istek sayısı dizesini bir tamsayıya dönüştürmek için strconv paketini kullan. Bu görev, recover özelliğinin sunucuların beklenmeyen panikleri zarif bir şekilde ele almasını nasıl sağladığını ve tek tek isteklerdeki hataların tüm sistemi devre dışı bırakmasını nasıl önlediğini gösterir.

Kendin dene

package main

import (
	"fmt"
	"strconv"
	"strings"
)

func main() {
	// Girdiyi oku
	var requestDetails string
	var serverConfig string
	fmt.Scanln(&requestDetails)
	fmt.Scanln(&serverConfig)
	
	// İstek detaylarını ayrıştır
	requestParts := strings.Split(requestDetails, ",")
	endpoint := requestParts[0]
	method := requestParts[1]
	action := requestParts[2]
	
	// Sunucu yapılandırmasını ayrıştır
	configParts := strings.Split(serverConfig, ",")
	serverName := configParts[0]
	maxRequests, _ := strconv.Atoi(configParts[1])
	
	// TODO: Kodunuzu aşağıya yazın
	// Kurtarma (recover) mekanizmalı handleRequest fonksiyonunu oluşturun
	// Sunucu başlatma mesajını yazdırın
	// handleRequest fonksiyonunu çağırın
	// Sunucu durumunu ve özetini yazdırın
	
}
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