golang实现封装trycatch异常处理

社区不少人在谈论 golang 为毛不用trycatch模式,而采用苛刻的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")
}


大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc