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

来源:互联网 发布:unity3d 人物模型 编辑:程序博客网 时间:2024/04/28 20:21

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

共 1794 字,阅读需 4 分钟

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

package mainimport ("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 = blockreturn t}func (t TryCatch) Catch(e error, block func(err error)) TryCatch {errorType := reflect.TypeOf(e)t.catches[errorType] = blockreturn t}func (t TryCatch) Finally(block func()) TryCatch {err := <-t.errChanif 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")}
原创粉丝点击