`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.
Görev
KolayPanikleri 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:
- Endpoint, method ve action değerlerini elde etmek için ilk girdiyi virgüllere göre böl
- Sunucu adını ve maksimum istek sayısını elde etmek için ikinci girdiyi virgüllere göre böl
- Maksimum istek sayısı dizesini bir tamsayıya dönüştür
- Endpoint, method, action ve sunucu adını parametre olarak alan
handleRequestadlı bir işlev oluştur handleRequestiçinde, panikleri yakalamak içinrecoverkullanan 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"
- Bir panik kurtarılırsa (recover nil olmayan bir değer döndürürse) şunu yazdır:
- 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ındanpanic("nil pointer access")çağır - Action
"panic_overflow"ise:"Attempting resource allocation"yazdır, ardındanpanic("memory overflow")çağır - Action
"panic_timeout"ise:"Attempting database connection"yazdır, ardındanpanic("connection timeout")çağır - Diğer tüm action değerleri için:
"Unknown action: [action]"yazdır, ardındanpanic("invalid action")çağır
- Action
- Main işlevinde, sunucu başlatma mesajını yazdır:
"Starting [server_name] with max [max_requests] requests" - Ayrıştırılmış parametrelerle
handleRequestişlevini çağır - İşlev çağrısından sonra sunucu durumunu yazdır:
"Server [server_name] is still running" - 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
}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ışlarKendi başına pratik yap: Online Go derleyicisi