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

85 lines
1.5 KiB
Go

package main
import (
"fmt"
)
func ProtokollierteOperation(name string, logEntries *[]string) string {
if logEntries != nil {
*logEntries = append(*logEntries, "START: "+name)
defer func() {
*logEntries = append(*logEntries, "ENDE: "+name)
}()
}
return "ERFOLG: " + name
}
type RessourcenManager struct {
ActiveLocks int
}
func (rm *RessourcenManager) Acquire() {
if rm != nil {
rm.ActiveLocks++
}
}
func (rm *RessourcenManager) Release() {
if rm != nil && rm.ActiveLocks > 0 {
rm.ActiveLocks--
}
}
func (rm *RessourcenManager) FuehreTransaktionAus(workFn func() int) int {
if rm == nil {
if workFn != nil {
return workFn()
}
return 0
}
rm.Acquire()
defer rm.Release()
if workFn != nil {
return workFn()
}
return 0
}
func KritischeBerechnung(teiler int) int {
if teiler == 0 {
panic("division durch null")
}
return 1000 / teiler
}
func SichereAusfuehrung(fn func()) (recoveredErr any, ok bool) {
defer func() {
if r := recover(); r != nil {
recoveredErr = r
ok = false
}
}()
if fn != nil {
fn()
}
return nil, true
}
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)
}