golang实现封装try/catch异常处理

作者:峰云就她了
链接:http://xiaorui.cc/
來源:个人博客

共 1794 字,阅读需 4 分钟

社区不少人在谈论 golang 为毛不用try/catch模式,而采用苛刻的recovery、panic、defer组合…. 从老外那整了一个trycatch包,感觉不错,拿出来分享下…

package main

import (
	"reflect"
)

type TryCatch struct {
	errChan      chan interface{}
	catches      map[reflect.Type]func(err error)
	defaultCatch func(err error)
}

func (t TryCatch) Try(block func()) TryCatch {
	t.errChan = make(chan interface{})
	t.catches = map[reflect.Type]func(err error){}
	t.defaultCatch = func(err error) {}
	go func() {
		defer func() {
			t.errChan <- recover()
		}()
		block()
	}()
	return t
}

func (t TryCatch) CatchAll(block func(err error)) TryCatch {
	t.defaultCatch = block
	return t
}

func (t TryCatch) Catch(e error, block func(err error)) TryCatch {
	errorType := reflect.TypeOf(e)
	t.catches[errorType] = block
	return t
}

func (t TryCatch) Finally(block func()) TryCatch {
	err := <-t.errChan
	if err != nil {
		catch := t.catches[reflect.TypeOf(err)]
		if catch != nil {
			catch(err.(error))
		} else {
			t.defaultCatch(err.(error))
		}
	}
	block()
	return t
}

type MyError struct {
	error
}

func main() {
	TryCatch{}.Try(func() {
		println("do something buggy")
		panic(MyError{})
	}).Catch(MyError{}, func(err error) {
		println("catch MyError")
	}).CatchAll(func(err error) {
		println("catch error")
	}).Finally(func() {
		println("finally do something")
	})
	println("done")
}

你可能感兴趣的:(golang实现封装try/catch异常处理)