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 spesifik bir gereksinime sahiptir: yalnızca ertelenmiş (deferred) bir fonksiyonun içinde kullanılabilir. Bir panik (panic) meydana geldiğinde, Go program sonlanmadan önce tüm ertelenmiş fonksiyonları çalıştırır; bu da recover'a paniği durdurma şansı 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.

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

Panikleri zarif bir şekilde yönetmek ve tüm sunucunun çökmesini önlemek için recover kullanan bir web sunucusu istek işleyicisi oluşturun. Bu meydan okuma, panikleri yakalamak ve sunucu kararlılığını korumak için ertelenmiş (deferred) bir fonksiyon içinde recover'ın nasıl kullanılacağını gösterir.

İki girdi alacaksınız:

  • "endpoint,method,action" formatında istek ayrıntılarını içeren bir dize (örneğin, "/api/users,GET,process")
  • "server_name,max_requests" formatında sunucu yapılandırmasını içeren bir dize (örneğin, "WebServer,100")

Göreviniz şunları yapmaktır:

  1. Birinci girdiyi virgüllere göre ayırarak endpoint, method ve action değerlerini elde edin
  2. İkinci girdiyi virgüllere göre ayırarak server name ve max requests değerlerini elde edin
  3. Maksimum istek (max requests) dizesini bir tam sayıya dönüştürün
  4. Parametre olarak endpoint, method, action ve server name alan handleRequest adında bir fonksiyon oluşturun
  5. handleRequest içinde, herhangi bir paniği yakalamak için recover kullanan ertelenmiş (deferred) bir fonksiyon ekleyin:
    • Eğer bir panik kurtarılırsa (recover nil olmayan bir değer döndürürse), şunu yazdırın: "Server [server_name] recovered from panic: [panic_value]"
    • Paniği yönettikten sonra şunu yazdırın: "Request handling completed safely"
  6. Ertelenmiş fonksiyondan sonra, eyleme (action) bağlı olarak istek işlemeyi simüle edin:
    • Eğer action "process" ise: "Processing [method] request to [endpoint]" yazdırın
    • Eğer action "panic_nil" ise: "Attempting dangerous operation" yazdırın ve ardından panic("nil pointer access") çağırın
    • Eğer action "panic_overflow" ise: "Attempting resource allocation" yazdırın ve ardından panic("memory overflow") çağırın
    • Eğer action "panic_timeout" ise: "Attempting database connection" yazdırın ve ardından panic("connection timeout") çağırın
    • Diğer tüm eylemler için: "Unknown action: [action]" yazdırın ve ardından panic("invalid action") çağırın
  7. Ana (main) fonksiyonda, sunucu başlatma mesajını yazdırın: "Starting [server_name] with max [max_requests] requests"
  8. Ayrıştırılan parametrelerle handleRequest fonksiyonunu çağırın
  9. Fonksiyon çağrısından sonra sunucu durumunu yazdırın: "Server [server_name] is still running"
  10. Son olarak, bir özet yazdırın:
    • "Server Summary:"
    • "Name: [server_name]"
    • "Max Requests: [max_requests]"
    • "Last Request: [method] [endpoint]"
    • "Action Performed: [action]"
    • "Status: Operational"

Girdi dizelerini virgüllere göre ayırmak için strings paketini ve maksimum istek dizesini tam sayıya dönüştürmek için strconv paketini kullanın. Bu meydan okuma, recover'ın sunucuların beklenmedik panikleri zarif bir şekilde yönetmesine nasıl izin verdiğini ve bireysel istek hatalarının tüm sistemi çökertmesini nasıl önlediğini gösterir.

Kopya kağıdı

recover fonksiyonu, bir paniği (panic) yakalamanıza ve programınızın çökmesini engelleyerek onu zarif bir şekilde yönetmenize olanak tanır.

recover yalnızca ertelenmiş (deferred) bir fonksiyon içinde kullanılabilir:

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

recover fonksiyonu, panic fonksiyonuna iletilen 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 uygun aksiyonu almanıza olanak tanır.

recover, tek bir isteğin neden olduğu paniğin tüm sunucuyu çökertmesini önlemek için web sunucularında yaygın olarak kullanılır.

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