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

 更新时间:2017年07月07日 15:11:10   作者:xiaorui  
Go语言追求简洁优雅,所以go语言不支持传统的 try…catch…finally 这种异常,最近发现了不错的trycatch包,下面这篇文章主要跟大家分享了关于利用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")
}

总结

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

相关文章

  • gin正确多次读取http request body内容实现详解

    gin正确多次读取http request body内容实现详解

    这篇文章主要为大家介绍了gin正确多次读取http request body内容实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • 从基础到高级全方位解析Go中反射的应用

    从基础到高级全方位解析Go中反射的应用

    本文我们将全面深入地探讨Go语言的反射机制,从反射的基础概念、为什么需要反射,到如何在Go中实现反射,以及在高级编程场景如泛型编程和插件架构中的应用,需要的可以参考下
    2023-10-10
  • win10下安装Go和Goland的详细教程

    win10下安装Go和Goland的详细教程

    这篇文章主要介绍了win10下安装Go和Goland的详细教程,本文给大家提到了go和golang之间的区别,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Go语言LeetCode题解937重新排列日志文件

    Go语言LeetCode题解937重新排列日志文件

    这篇文章主要为大家介绍了Go语言LeetCode题解937重新排列日志文件,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Go语言实现基于websocket浏览器通知功能

    Go语言实现基于websocket浏览器通知功能

    这篇文章主要介绍了Go语言实现基于websocket浏览器通知功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • golang使用sort接口实现排序示例

    golang使用sort接口实现排序示例

    这篇文章主要介绍了golang使用sort接口实现排序的方法,简单分析了sort接口的功能并实例演示了基于sort接口的排序实现方法,需要的朋友可以参考下
    2016-07-07
  • Go语言使用MongoDB数据库详细步骤

    Go语言使用MongoDB数据库详细步骤

    mongodb是一种高性能、开源、文档型的nosql数据库,被广泛应用于web应用、大数据以及云计算领域,下面这篇文章主要给大家介绍了关于Go语言使用MongoDB数据库的详细步骤,需要的朋友可以参考下
    2024-05-05
  • Golang科学计数法转换string数字输出的实现

    Golang科学计数法转换string数字输出的实现

    最近接手一个商城运单号模块,接手后发现有部分运单号返回给前端是按照科学计数法的方式返回,本文就介绍一下Golang科学计数法转换string数字输出,感兴趣的可以了解一下
    2021-07-07
  • 深入理解Golang Channel 的底层结构

    深入理解Golang Channel 的底层结构

    这篇文章主要介绍了深入理解Golang Channel 的底层结构,Go 语言的 channel 底层是什么数据结构?下面我们就一起来深入解析一下 channel,需要的朋友可以参考下
    2022-01-01
  • Golang异常控制处理程序错误流程

    Golang异常控制处理程序错误流程

    这篇文章主要介绍了Golang异常控制处理程序错误流程,Golang异常处理机制包括错误处理、panic和defer,可控制程序错误流程,保证程序稳定性和安全性,是Golang编程的关键方式
    2023-04-04

最新评论