Menu
Coddy logo textTech

`recover` verwenden

Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy — Lektion 43 von 68.

Während panic Ihr Programm sofort stoppt, bietet Go eine Möglichkeit, die Kontrolle über die recover-Funktion zurückzugewinnen. Die recover-Funktion ermöglicht es Ihnen, ein Panic abzufangen und es kontrolliert zu behandeln, wodurch verhindert wird, dass Ihr gesamtes Programm abstürzt.

Allerdings hat recover eine sehr spezifische Anforderung: Es kann nur innerhalb einer verzögerten Funktion (deferred function) verwendet werden. Wenn ein Panic auftritt, führt Go alle verzögerten Funktionen aus, bevor das Programm beendet wird, was recover die Möglichkeit gibt, den Panic abzufangen:

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

Die Funktion recover gibt den Wert zurück, der an panic übergeben wurde, oder nil, falls kein Panic aufgetreten ist. Dies ermöglicht es Ihnen zu prüfen, ob ein Panic aufgetreten ist, und entsprechende Maßnahmen zu ergreifen, wie zum Beispiel das Protokollieren des Fehlers oder das Durchführen von Bereinigungsoperationen.

Wie panic sollte auch recover in Go sparsam eingesetzt werden. Es wird am häufigsten in Szenarien wie Webservern eingesetzt, in denen man verhindern möchte, dass das Panic einer einzelnen Anfrage den gesamten Server zum Absturz bringt, sodass dieser weiterhin andere Anfragen bearbeiten kann.

quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

challenge icon

Aufgabe

Einfach

Erstellen Sie einen Webserver-Request-Handler, der recover verwendet, um Panics elegant zu behandeln und zu verhindern, dass der gesamte Server abstürzt. Diese Herausforderung zeigt, wie man recover innerhalb einer verzögerten Funktion (deferred function) einsetzt, um Panics abzufangen und die Serverstabilität aufrechtzuerhalten.

Sie erhalten zwei Eingaben:

  • Einen String mit Request-Details im Format "endpoint,method,action" (z. B. "/api/users,GET,process")
  • Einen String mit der Serverkonfiguration im Format "server_name,max_requests" (z. B. "WebServer,100")

Ihre Aufgabe ist es:

  1. Die erste Eingabe durch Trennen an den Kommas zu parsen, um endpoint, method und action zu erhalten
  2. Die zweite Eingabe durch Trennen an den Kommas zu parsen, um server name und max requests zu erhalten
  3. Den String für max requests in eine Ganzzahl (Integer) umzuwandeln
  4. Eine Funktion namens handleRequest zu erstellen, die endpoint, method, action und server name als Parameter entgegennimmt
  5. Innerhalb von handleRequest eine verzögerte Funktion (deferred function) hinzuzufügen, die recover verwendet, um etwaige Panics abzufangen:
    • Wenn eine Panic abgefangen wird (recover gibt einen Wert ungleich nil zurück), geben Sie aus: "Server [server_name] recovered from panic: [panic_value]"
    • Geben Sie nach der Behandlung der Panic aus: "Request handling completed safely"
  6. Simulieren Sie nach der verzögerten Funktion die Request-Verarbeitung basierend auf der action:
    • Wenn die action "process" ist: Geben Sie "Processing [method] request to [endpoint]" aus
    • Wenn die action "panic_nil" ist: Geben Sie "Attempting dangerous operation" aus und rufen Sie dann panic("nil pointer access") auf
    • Wenn die action "panic_overflow" ist: Geben Sie "Attempting resource allocation" aus und rufen Sie dann panic("memory overflow") auf
    • Wenn die action "panic_timeout" ist: Geben Sie "Attempting database connection" aus und rufen Sie dann panic("connection timeout") auf
    • Für jede andere action: Geben Sie "Unknown action: [action]" aus und rufen Sie dann panic("invalid action") auf
  7. Geben Sie in der main-Funktion die Startmeldung des Servers aus: "Starting [server_name] with max [max_requests] requests"
  8. Rufen Sie die Funktion handleRequest mit den geparsten Parametern auf
  9. Geben Sie nach dem Funktionsaufruf den Serverstatus aus: "Server [server_name] is still running"
  10. Geben Sie abschließend eine Zusammenfassung aus:
    • "Server Summary:"
    • "Name: [server_name]"
    • "Max Requests: [max_requests]"
    • "Last Request: [method] [endpoint]"
    • "Action Performed: [action]"
    • "Status: Operational"

Verwenden Sie das strings-Paket, um die Eingabestrings an den Kommas zu trennen, und das strconv-Paket, um den String für max requests in eine Ganzzahl umzuwandeln. Diese Herausforderung zeigt, wie recover es Servern ermöglicht, unerwartete Panics elegant zu handhaben und zu verhindern, dass Fehler bei einzelnen Requests das gesamte System zum Absturz bringen.

Spickzettel

Die recover-Funktion ermöglicht es Ihnen, ein Panic abzufangen und kontrolliert zu behandeln, wodurch verhindert wird, dass Ihr Programm abstürzt.

recover kann nur innerhalb einer verzögerten (deferred) Funktion verwendet werden:

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

Die recover-Funktion gibt den Wert zurück, der an panic übergeben wurde, oder nil, falls kein Panic aufgetreten ist. Dies ermöglicht es Ihnen zu prüfen, ob ein Panic aufgetreten ist, und entsprechende Maßnahmen zu ergreifen.

recover wird häufig in Webservern verwendet, um zu verhindern, dass ein Panic bei einer einzelnen Anfrage den gesamten Server zum Absturz bringt.

Probier es selbst

package main

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

func main() {
	// Eingabe lesen
	var requestDetails string
	var serverConfig string
	fmt.Scanln(&requestDetails)
	fmt.Scanln(&serverConfig)
	
	// Anfragedetails parsen
	requestParts := strings.Split(requestDetails, ",")
	endpoint := requestParts[0]
	method := requestParts[1]
	action := requestParts[2]
	
	// Serverkonfiguration parsen
	configParts := strings.Split(serverConfig, ",")
	serverName := configParts[0]
	maxRequests, _ := strconv.Atoi(configParts[1])
	
	// TODO: Schreiben Sie Ihren Code unten
	// Erstellen Sie die handleRequest-Funktion mit Recover-Mechanismus
	// Server-Startmeldung ausgeben
	// handleRequest-Funktion aufrufen
	// Serverstatus und Zusammenfassung ausgeben
	
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logik & Ablauf