Aufgaben-Python/courses/go/08_defer_panic_und_recover/aufgabe.go

73 lines
2.2 KiB
Go

package main
import (
"fmt"
)
// 🎯 TEILZIEL 1 (TODO 1): Protokolliere den Start und das Ende einer Operation mit defer
// Ablauf in ProtokollierteOperation:
// 1. Hänge "START: " + name an *logEntries an.
// 2. Registriere ein defer, das "ENDE: " + name an *logEntries anhängt.
// 3. Gib "ERFOLG: " + name zurück.
func ProtokollierteOperation(name string, logEntries *[]string) string {
// TODO: Start eintragen, defer für Ende registrieren und Ergebnis zurückgeben
return ""
}
// 🎯 TEILZIEL 2 (TODO 2): Ressourcen-Manager
type RessourcenManager struct {
ActiveLocks int
}
func (rm *RessourcenManager) Acquire() {
rm.ActiveLocks++
}
func (rm *RessourcenManager) Release() {
if rm.ActiveLocks > 0 {
rm.ActiveLocks--
}
}
// FuehreTransaktionAus soll:
// 1. rm.Acquire() aufrufen
// 2. per defer rm.Release() sicherstellen
// 3. workFn() ausführen und das Ergebnis zurückgeben
func (rm *RessourcenManager) FuehreTransaktionAus(workFn func() int) int {
// TODO: Acquire aufrufen, defer Release registrieren, workFn ausführen
return 0
}
// 🎯 TEILZIEL 3 (TODO 3): Kritische Berechnung mit explizitem panic
// Falls teiler == 0 ist: rufe panic("division durch null") auf.
// Andernfalls: gib 1000 / teiler zurück.
func KritischeBerechnung(teiler int) int {
// TODO: Bei teiler == 0 panicken, sonst Ganzzahldivision
return 0
}
// 🎯 TEILZIEL 4 (TODO 4): Sichere Ausführung mit defer und recover()
// Führe 'fn()' geschützt aus:
// - Wenn fn() ohne Panic durchläuft: gib (nil, true) zurück.
// - Wenn fn() einen Panic auslöst: fange ihn mit recover() ab und gib (panicGrund, false) zurück.
func SichereAusfuehrung(fn func()) (recoveredErr any, ok bool) {
// TODO: Nutze defer mit anonymer Funktion und recover()
return nil, false
}
func main() {
var logs []string
res := ProtokollierteOperation("Datenbank-Backup", &logs)
fmt.Printf("%s | Logs: %v\n", res, logs)
rm := &RessourcenManager{}
tRes := rm.FuehreTransaktionAus(func() int {
return 42 * 2
})
fmt.Printf("Transaktion Resultat: %d, Locks nach Ende: %d\n", tRes, rm.ActiveLocks)
err, ok := SichereAusfuehrung(func() {
KritischeBerechnung(0)
})
fmt.Printf("Panic abgefangen: ok=%t, Fehler=%v\n", ok, err)
}