13.5 使用闭包进行错误处理
...小于 1 分钟
13.5 使用闭包进行错误处理
当所有函数都是同一种签名时,可以使用闭包来进行错误处理。
假设函数:
fType1 = func f(a type1, b type2)
使用两个帮助函数:
用于检查错误并触发panic
func check(err error) { if err != nil { panic(err) } }
包装函数
func errorHandler(fn fType1) fType1 { return func(a type1, b type2) { defer func() { if err, ok := recover().(error); ok { log.Printf("run time panic: %v", err) } }() } fn(a, b) }
package chapter_13
import (
"fmt"
"log"
)
type handlerFunc func(a int, b string)
func recoverClosure() {
f := errorHandler(handler1)
f(1, "A")
}
func handler1(a int, b string) {
panic(fmt.Errorf("handler1 error, a: %d, b: %q", a, b))
}
func errorHandler(fn handlerFunc) handlerFunc {
return func(a int, b string) {
defer func() {
if err, ok := recover().(error); ok {
log.Printf("run time panic: %v", err)
}
}()
fn(a, b)
}
}
2023/05/12 21:47:59 run time panic: handler1 error, a: 1, b: "A"
Powered by Waline v2.15.2