85 lines
1.5 KiB
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)
|
|
}
|