利用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")
}

总结

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

(0)

相关推荐

  • 深入理解golang的异常处理机制

    前言 众所周知在java或php等很多面向对象的语言中, 异常处理是依靠throw.catch来进行的.在go语言中,panic和recover函数在作用层面分别对等throw和catch语句,当然也存在不同之处.下面话不多说,来一起看看详细的介绍吧. 从设计层面来看,panic和recover函数适用于那些真正的异常(例如整数除0),而throw catch finally机制常常被用来处理一些业务层面的自定义异常.因此在go语言中,panic和recover要慎用. 上述两种异常机制的使用中

  • 利用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) d

  • PHP利用curl发送HTTP请求的实例代码

    cURL 函数概述 PHP支持的由Daniel Stenberg创建的libcurl库允许你与各种的服务器使用各种类型的协议进行连接和通讯. libcurl目前支持http.https.ftp.gopher.telnet.dict.file和ldap协议.libcurl同时也支持HTTPS认证.HTTP POST.HTTP PUT. FTP 上传(这个也能通过PHP的FTP扩展完成).HTTP 基于表单的上传.代理.cookies和用户名+密码的认证. PHP中使用cURL实现Get和Post请

  • jQuery 利用ztree实现树形表格的实例代码

    最近公司的项目中要做一个树形表格,因为之前一直在用ztree实现基本的树形结构,理所当然的首先想到利用ztree来做. 网上找了一下别人做的树形表格,有使用ztree的,也有使用treeTable的,但效果都不太好,于是参考使用ztree的做法自己做了一个,贴出来供大家参考,请看注释说明,效果如下所示. <!DOCTYPE HTML> <html> <head> <link href="https://cdn.bootcss.com/zTree.v3/3

  • iOS利用UIScrollView实现图片的缩放实例代码

    本文介绍了iOS利用UIScrollView实现图片的缩放实例代码,分享给大家: 第一步:添加scrollView到控制器中 UIScrollView *scrollView = [[UIScrollView alloc] init]; scrollView.frame = CGRectMake(40, 250, 300, 200); self.scrollView = scrollView; [self.view addSubview:scrollView]; 第二步:添加图片控件到scrol

  • 基于JDBC封装的BaseDao(实例代码)

    最近闲暇时萌发写一写dao的封装的例子,就将以前写的整理一下. public class BaseDao<T> { Connection conn; PreparedStatement st; ResultSet rs; JdbcUtil jdbcUtil = new JdbcUtil(); int result = 0; private Class<T> persistentClass; @SuppressWarnings("unchecked") publi

  • Python 中的Selenium异常处理实例代码

    自动化测试执行过程中,难免会有错误/异常出现,比如测试脚本没有发现对应元素,则会立刻抛出NoSuchElementException异常.这时不要怕,肯定是测试脚本或者测试环境哪里出错了!那如何处理才是关键?因为一般只是局部有问题,为了让脚本继续执行,so我们可以用try...except...raise捕获异常.该捕获异常后可以打印出相应的异常原因,这样以便于分析异常原因. 下面将举例说明,当异常抛出后将信息打印在控制台,同时截取当前浏览器窗口,作为后续bug的依据给相应开发人员更好下定位问题

  • 利用Python进行数据可视化的实例代码

    目录 前言 首先搭建环境 实例代码 例子1: 例子2: 例子3: 例子4: 例子5: 例子6: 总结 前言 前面写过一篇用Python制作PPT的博客,感兴趣的可以参考 用Python制作PPT 这篇是关于用Python进行数据可视化的,准备作为一个长贴,随时更新有价值的Python可视化用例,都是网上搜集来的,与君共享,本文所有测试均基于Python3. 首先搭建环境 $pip install pyecharts -U $pip install echarts-themes-pypkg $pi

  • 利用JavaScript实现新闻滚动效果(实例代码)

    最近要实现一个滚动新闻效果,在网上查了一些资料,发现基本的实现方法有两种: 1.使用Marquee标签.这个标签的使用我已经转载了一篇比较详细的文章,这个标签的优点是便于使用,缺点是人们已经逐渐不适用它了,许多浏览器不支持,甚至在IE8想,XHTML4.0的loose.dtd是可以的,而去掉loose.dtd却不行. 2.使用div+javascript的方法.这种方法的好处是可以兼容几乎所有的浏览器,并且在可以预料的时间内仍能稳定运行.并且使用div使得网页可以利用现有的css资源实现很多炫目

  • python利用hook技术破解https的实例代码

    相对于http协议,http是的特点就是他的安全性,http协议的通信内容用普通的嗅探器可以捕捉到,但是https协议的内容嗅探到的是加密后的内容,对我们的利用价值不是很高,所以一些大的网站----涉及到"大米"的网站,采用的都是http是协议,嘿嘿,即便这样,还是有办法能看到他的用户名和密码的,嘿嘿,本文只是用于技术学习,只是和大家交流技术,希望不要用于做违法的事情,这个例子是在firefox浏览器下登录https协议的网站,我们预先打开程序,就来了个捕获用户名和密码: 下面是源代码

  • 利用jQuery实现打字机字幕效果实例代码

    实现效果: 实现原理: 把html里的代码读进来, 然后跳过"<"和">"之间的代码, 顺便保存了内容的格式, 然后一个定时器,逐个输出. 用到的基础知识: jQuery为开发插件提拱了两个方法,分别是: jQuery.fn.extend(object); jQuery.extend(object); jQuery.extend(object); 为扩展jQuery类本身.为类添加新的方法. jQuery.fn.extend(object);给jQuer

随机推荐