用户登录
用户注册

分享至

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

  • 作者: BIG笑工坊929
  • 来源: 51数据库
  • 2021-10-04

前言

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。

软件
前端设计
程序设计
Java相关