Menu
CoddyTech

Menggunakan `recover`

Termasuk bagian Logika & Alur dalam perjalanan GO di Coddy. Pelajaran 43 dari 68.

Meskipun panic langsung menghentikan programmu, Go menyediakan cara untuk mendapatkan kembali kendali melalui fungsi recover. Fungsi recover memungkinkan kamu menangkap panic dan menanganinya dengan baik, sehingga seluruh programmu tidak mengalami crash.

Namun, recover memiliki persyaratan yang sangat spesifik: fungsi ini hanya dapat digunakan di dalam fungsi yang ditunda. Saat panic terjadi, Go menjalankan semua fungsi yang ditunda sebelum program berakhir, sehingga recover berkesempatan untuk menangani panic tersebut:

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

Fungsi recover mengembalikan nilai yang diteruskan ke panic, atau nil jika tidak terjadi panic. Dengan begitu, kamu bisa memeriksa apakah panic terjadi dan mengambil tindakan yang sesuai, seperti mencatat error atau melakukan operasi pembersihan.

Seperti panic, recover sebaiknya digunakan secukupnya di Go. Penggunaan ini paling sering terlihat dalam situasi seperti server web, saat kamu ingin mencegah panic pada satu permintaan menyebabkan seluruh server berhenti, sehingga server dapat terus melayani permintaan lainnya.

challenge icon

Tantangan

Mudah

Buat handler permintaan server web yang menggunakan recover untuk menangani panic dengan baik dan mencegah seluruh server berhenti. Tantangan ini menunjukkan cara menggunakan recover di dalam fungsi tertunda untuk menangkap panic dan menjaga kestabilan server.

Kamu akan menerima dua input:

  • Sebuah string berisi detail permintaan dengan format "endpoint,method,action" (misalnya, "/api/users,GET,process")
  • Sebuah string berisi konfigurasi server dengan format "server_name,max_requests" (misalnya, "WebServer,100")

Tugasmu adalah:

  1. Parse input pertama dengan memisahkannya berdasarkan koma untuk mendapatkan endpoint, method, dan action
  2. Parse input kedua dengan memisahkannya berdasarkan koma untuk mendapatkan nama server dan jumlah permintaan maksimum
  3. Ubah string jumlah permintaan maksimum menjadi bilangan bulat
  4. Buat fungsi bernama handleRequest yang menerima endpoint, method, action, dan nama server sebagai parameter
  5. Di dalam handleRequest, tambahkan fungsi tertunda yang menggunakan recover untuk menangkap panic apa pun:
    • Jika panic berhasil dipulihkan (recover mengembalikan nilai non-nil), cetak: "Server [server_name] recovered from panic: [panic_value]"
    • Setelah menangani panic, cetak: "Request handling completed safely"
  6. Setelah fungsi tertunda, simulasikan pemrosesan permintaan berdasarkan action:
    • Jika action adalah "process": cetak "Processing [method] request to [endpoint]"
    • Jika action adalah "panic_nil": cetak "Attempting dangerous operation" lalu panggil panic("nil pointer access")
    • Jika action adalah "panic_overflow": cetak "Attempting resource allocation" lalu panggil panic("memory overflow")
    • Jika action adalah "panic_timeout": cetak "Attempting database connection" lalu panggil panic("connection timeout")
    • Untuk action lainnya: cetak "Unknown action: [action]" lalu panggil panic("invalid action")
  7. Di fungsi utama, cetak pesan saat server dimulai: "Starting [server_name] with max [max_requests] requests"
  8. Panggil fungsi handleRequest dengan parameter yang sudah di-parse
  9. Setelah pemanggilan fungsi, cetak status server: "Server [server_name] is still running"
  10. Terakhir, cetak ringkasan:
    • "Server Summary:"
    • "Name: [server_name]"
    • "Max Requests: [max_requests]"
    • "Last Request: [method] [endpoint]"
    • "Action Performed: [action]"
    • "Status: Operational"

Gunakan package strings untuk memisahkan string input berdasarkan koma dan package strconv untuk mengubah string jumlah permintaan maksimum menjadi bilangan bulat. Tantangan ini menunjukkan cara recover memungkinkan server menangani panic tak terduga dengan baik, sehingga kegagalan permintaan individual tidak membuat seluruh sistem berhenti.

Coba sendiri

package main

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

func main() {
	// Baca input
	var requestDetails string
	var serverConfig string
	fmt.Scanln(&requestDetails)
	fmt.Scanln(&serverConfig)
	
	// Uraikan detail permintaan
	requestParts := strings.Split(requestDetails, ",")
	endpoint := requestParts[0]
	method := requestParts[1]
	action := requestParts[2]
	
	// Uraikan konfigurasi server
	configParts := strings.Split(serverConfig, ",")
	serverName := configParts[0]
	maxRequests, _ := strconv.Atoi(configParts[1])
	
	// TODO: Tulis kodemu di bawah ini
	// Buat fungsi handleRequest dengan mekanisme recover
	// Cetak pesan saat server mulai berjalan
	// Panggil fungsi handleRequest
	// Cetak status dan ringkasan server
	
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Logika & Alur

Latihan sendiri: Compiler Go online