13.5 使用闭包进行错误处理

Kesa...小于 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)
    }
    

13_5_panic_recover_closure.go

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