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
