`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.
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Görev
KolayPanikleri 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:
- Birinci girdiyi virgüllere göre ayırarak endpoint, method ve action değerlerini elde edin
- İkinci girdiyi virgüllere göre ayırarak server name ve max requests değerlerini elde edin
- Maksimum istek (max requests) dizesini bir tam sayıya dönüştürün
- Parametre olarak endpoint, method, action ve server name alan
handleRequestadında bir fonksiyon oluşturun handleRequestiçinde, herhangi bir paniği yakalamak içinrecoverkullanan 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"
- Eğer bir panik kurtarılırsa (recover nil olmayan bir değer döndürürse), şunu yazdırın:
- 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ındanpanic("nil pointer access")çağırın - Eğer action
"panic_overflow"ise:"Attempting resource allocation"yazdırın ve ardındanpanic("memory overflow")çağırın - Eğer action
"panic_timeout"ise:"Attempting database connection"yazdırın ve ardındanpanic("connection timeout")çağırın - Diğer tüm eylemler için:
"Unknown action: [action]"yazdırın ve ardındanpanic("invalid action")çağırın
- Eğer action
- Ana (main) fonksiyonda, sunucu başlatma mesajını yazdırın:
"Starting [server_name] with max [max_requests] requests" - Ayrıştırılan parametrelerle
handleRequestfonksiyonunu çağırın - Fonksiyon çağrısından sonra sunucu durumunu yazdırın:
"Server [server_name] is still running" - 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
}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ışlar