go / expert
Snippet
Selektive Panic-Wiederherstellung und kontextuelle Fehlerkonvertierung über verzögerte Aufrufe
In Go steigen Panics im Stack auf und bringen den Prozess zum Absturz, sofern sie nicht mit recover() in einem verzögerten Funktionsaufruf (defer) abgefangen werden. Benannte Rückgabewerte ermöglichen es einem deferred Handler, den zurückgegebenen Fehler der äußeren Funktion im Falle einer Wiederherstellung direkt zu überschreiben. Die Typen-Unterscheidung auf dem abgefangenen Interface-Wert unterscheidet Standard-Fehlertypen von beliebigen Panic-Werten.
snippet.go
go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package safeexecimport ("fmt")func ExecuteTaskSafely(task func()) (err error) {defer func() {if r := recover(); r != nil {switch e := r.(type) {case error:err = fmt.Errorf("task panicked with error: %w", e)default:err = fmt.Errorf("task panicked with value: %v", e)}}}()task()return nil}
Erklärung
1
func ExecuteTaskSafely(task func()) (err error) {
Verwendet einen benannten Rückgabeparameter 'err', damit die deferred Closure das Ergebnis nach dem Abfangen zuweisen kann.
2
defer func() { ... }()
Registriert eine verzögerte Funktion, die beim Beenden oder Paniken der umschließenden Funktion automatisch ausgeführt wird.
3
if r := recover(); r != nil {
Fängt eine aktive Panic ab, stoppt das Entrollen des Stacks und liefert den an panic() übergebenen Wert.
4
switch e := r.(type) {
Führt einen dynamischen Typ-Switch auf der Panic-Nutzlast aus, um das typsichere Wrapping korrekt zu formatieren.