当前位置 博文首页 > 利用golang实现封装trycatch异常处理实例代码

    利用golang实现封装trycatch异常处理实例代码

    作者:xiaorui 时间:2021-05-11 18:20

    前言

    社区不少人在谈论 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")
    }

    总结

    js
    下一篇:没有了