go语言中的try、catch、throw实现
func (o *MsSqlUtils) ExecuteSql(cmd string) (err1 error, affected int64) {defer func() { //必须要先声明defer,否则不能捕获到panic异常if err2 := recover(); err2 != nil {err1 = fmt.Errorf("internal error: %v", err2)}}()stmt, err := o.Db.Prepare(cmd)checkErr(err)var res sql.Resultres, err1 = stmt.Exec()checkErr(err1)if err1 != nil {affected, err1 = res.RowsAffected()}return
}
函数中的defer中调用了recover(),获取错误,并作为函数的返回值。
go中很多函数有error类型的返回值,如果希望以异常的形式抛出,可以调用panic让recover函数捕获,如:
func (o *MsSqlUtils) ExecuteWithTrans(callback TransCallback) (err1 error) {defer func() { //必须要先声明defer,否则不能捕获到panic异常if err2 := recover(); err2 != nil {err1 = fmt.Errorf("internal error: %v", err2)}}()trans, _ := o.Db.Begin()err := callback(o)if err == nil {trans.Commit()} else {trans.Rollback()panic(err)}return
}
这里callback是函数调用者编写的函数,如果其中有错误发生,则使用panic抛出异常,让上面的recover捕获。
或采用网上的封装,模拟C++的方式:
package tryimport "reflect"// Try catches exception from f
func Try(f func()) *tryStruct {return &tryStruct{catches: make(map[reflect.Type]ExeceptionHandler),hold: f,}
}// ExeceptionHandler handle exception
type ExeceptionHandler func(interface{})type tryStruct struct {catches map[reflect.Type]ExeceptionHandlerhold func()
}func (t *tryStruct) Catch(e interface{}, f ExeceptionHandler) *tryStruct {t.catches[reflect.TypeOf(e)] = freturn t
}func (t *tryStruct) Finally(f func()) {defer func() {if e := recover(); nil != e {if h, ok := t.catches[reflect.TypeOf(e)]; ok {h(e)} else {f()}}}()t.hold()
}//demo
import ("log""try"
)func main() {try.Try(func() {panic("123")}).Catch(1, func(e interface{}) {log.Println("int", e)}).Catch("", func(e interface{}) {log.Println("string", e)}).Finally(func() {log.Println("finally")})
}
go语言中的try、catch、throw实现相关推荐
- C++中try/catch/throw的使用
C++异常是指在程序运行时发生的反常行为,这些行为超出了函数正常功能的范围.当程序的某部分检测到一个它无法处理的问题时,需要用到异常处理.异常提供了一种转移程序控制权的方式.C++异常处理涉及到三个关 ...
- php indexof的用法,c语言中indexof的用法有哪些
c语言中indexof的用法有哪些 index在互联网上表示网站的默认主页.一般为 index.html index.htmindex.aspindex.php:另外的默认主页也多用default.h ...
- C++语言中std::array的神奇用法总结,你需要知道!
摘要:在这篇文章里,将从各个角度介绍下std::array的用法,希望能带来一些启发. td::array是在C++11标准中增加的STL容器,它的设计目的是提供与原生数组类似的功能与性能.也正因此, ...
- java中flush函数作用_Java语言中flush()函数作用及使用方法详解
最近在学习io流,发现每次都会出现flush()函数,查了一下其作用,起作用主要如下 //------–flush()的作用--------– 笼统且错误的回答: 缓冲区中的数据保存直到缓冲区满后才写 ...
- java的逻辑常量_在Java语言中,逻辑常量只有true和(__)两个值;
[填空题]定义类的保留字是(__)定义接口的保留字是(__); [单选题]结合了不同类型的防火墙特点的是( ). [填空题]Java将运行错误分为两类:(__)和(__), 其对应的类均派生自(__) ...
- c语言中std::map_在现代C ++中明智地使用std :: map
c语言中std::map std::map and its siblings(std::multimap, std::unordered_map/multimap) used to be my fav ...
- go语言中的defer、panic、recover处理异常
go语言中的defer就像c++中的析构函数,但是go语言中defer的对象是函数(或者对象的方法),defer能保证在函数结束最后执行该方法(函数),但是有例外:如果在定义的方法中defer定义的方 ...
- c语言数组中逗号的作用,在C语言中,每个语句和数据定义是用( )结束。? 逗号|括号|分号|句号...
在C语言中,每个语句和数据定义是用( )结束.? 逗号|括号|分号|句号 更多相关问题 [多选题]有关商事登记的内容,下列表述哪些是不正确的: A. 商事登记不是取得商人资格的必备条件 B. 商事登记 ...
- 1.实现sql语言中DQL语言,实现简单查询、条件查询、排序查询等。
1.实现sql语言中DQL语言,实现简单查询.条件查询.排序查询等. (1)检索grade表当中的所有信息. (2)检索grade表数学成绩大于100的所有人信息. <%@ page langu ...
- fwrite函数的用法示例_C语言中的fwrite()函数(带有示例)
fwrite函数的用法示例 C中的fwrite()函数 (fwrite() function in C) Prototype: 原型: size_t fwrite(void *buffer, size ...
最新文章
- 吐血整理:24种可视化图表优缺点对比,一图看懂!
- python操作docx学习资料
- JAVA期末考试工程部分_知到Java程序设计(山西工程职业学院)考试期末答案
- 基于wordpress搭建网站和基于nodejs自己搭建
- 英特尔 超核芯显卡 620mac_英特尔也玩马甲?有关USB TypeC的冷知识你了解多少
- 计算机寄存器及标志位详解
- 【hiho】127 后缀自动机一·基本概念 【后缀自动机】
- 计算机网络 IP:ABC类地址与 子网掩码(ABC类网络均有属于自己的私有IP段 节省32位IP资源 ) 网络地址 主机地址 子网 与子网掩码之间的关系换算 IP和子网掩码相互依存
- 微信小程序全栈开发实践 第一章 重新认识微信小程序、及新功能介绍
- Taro 与 React 的差异(Taro的约束(keng))
- Selenium学习——QQ空间点赞好友说说
- CISCO交换机备份和恢复配置文件
- opencv 实现 Photoshop 亮度 对比度 调节功能
- c程序的基本组成单位是什么?
- 05_Python_变量的基本使用
- 诺基亚两年裁员11044人,中国幅度最大达3500人
- 浅谈工作周报的目的及意义
- 支付宝借呗跟花呗有什么区别?
- 解码大数据视频营销 爱奇艺专场闪耀2013金投赏
- 用c写的桥牌发牌代码