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实现相关推荐

  1. C++中try/catch/throw的使用

    C++异常是指在程序运行时发生的反常行为,这些行为超出了函数正常功能的范围.当程序的某部分检测到一个它无法处理的问题时,需要用到异常处理.异常提供了一种转移程序控制权的方式.C++异常处理涉及到三个关 ...

  2. php indexof的用法,c语言中indexof的用法有哪些

    c语言中indexof的用法有哪些 index在互联网上表示网站的默认主页.一般为 index.html index.htmindex.aspindex.php:另外的默认主页也多用default.h ...

  3. C++语言中std::array的神奇用法总结,你需要知道!

    摘要:在这篇文章里,将从各个角度介绍下std::array的用法,希望能带来一些启发. td::array是在C++11标准中增加的STL容器,它的设计目的是提供与原生数组类似的功能与性能.也正因此, ...

  4. java中flush函数作用_Java语言中flush()函数作用及使用方法详解

    最近在学习io流,发现每次都会出现flush()函数,查了一下其作用,起作用主要如下 //------–flush()的作用--------– 笼统且错误的回答: 缓冲区中的数据保存直到缓冲区满后才写 ...

  5. java的逻辑常量_在Java语言中,逻辑常量只有true和(__)两个值;

    [填空题]定义类的保留字是(__)定义接口的保留字是(__); [单选题]结合了不同类型的防火墙特点的是( ). [填空题]Java将运行错误分为两类:(__)和(__), 其对应的类均派生自(__) ...

  6. 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 ...

  7. go语言中的defer、panic、recover处理异常

    go语言中的defer就像c++中的析构函数,但是go语言中defer的对象是函数(或者对象的方法),defer能保证在函数结束最后执行该方法(函数),但是有例外:如果在定义的方法中defer定义的方 ...

  8. c语言数组中逗号的作用,在C语言中,每个语句和数据定义是用( )结束。? 逗号|括号|分号|句号...

    在C语言中,每个语句和数据定义是用( )结束.? 逗号|括号|分号|句号 更多相关问题 [多选题]有关商事登记的内容,下列表述哪些是不正确的: A. 商事登记不是取得商人资格的必备条件 B. 商事登记 ...

  9. 1.实现sql语言中DQL语言,实现简单查询、条件查询、排序查询等。

    1.实现sql语言中DQL语言,实现简单查询.条件查询.排序查询等. (1)检索grade表当中的所有信息. (2)检索grade表数学成绩大于100的所有人信息. <%@ page langu ...

  10. fwrite函数的用法示例_C语言中的fwrite()函数(带有示例)

    fwrite函数的用法示例 C中的fwrite()函数 (fwrite() function in C) Prototype: 原型: size_t fwrite(void *buffer, size ...

最新文章

  1. 吐血整理:24种可视化图表优缺点对比,一图看懂!
  2. python操作docx学习资料
  3. JAVA期末考试工程部分_知到Java程序设计(山西工程职业学院)考试期末答案
  4. 基于wordpress搭建网站和基于nodejs自己搭建
  5. 英特尔 超核芯显卡 620mac_英特尔也玩马甲?有关USB TypeC的冷知识你了解多少
  6. 计算机寄存器及标志位详解
  7. 【hiho】127 后缀自动机一·基本概念 【后缀自动机】
  8. 计算机网络 IP:ABC类地址与 子网掩码(ABC类网络均有属于自己的私有IP段 节省32位IP资源 ) 网络地址 主机地址 子网 与子网掩码之间的关系换算 IP和子网掩码相互依存
  9. 微信小程序全栈开发实践 第一章 重新认识微信小程序、及新功能介绍
  10. Taro 与 React 的差异(Taro的约束(keng))
  11. Selenium学习——QQ空间点赞好友说说
  12. CISCO交换机备份和恢复配置文件
  13. opencv 实现 Photoshop 亮度 对比度 调节功能
  14. c程序的基本组成单位是什么?
  15. 05_Python_变量的基本使用
  16. 诺基亚两年裁员11044人,中国幅度最大达3500人
  17. 浅谈工作周报的目的及意义
  18. 支付宝借呗跟花呗有什么区别?
  19. 解码大数据视频营销 爱奇艺专场闪耀2013金投赏
  20. 用c写的桥牌发牌代码

热门文章

  1. john5(john5和曼森的关系)
  2. Nginx平滑升级与自定义错误页面
  3. 2011年国外最受欢迎的15个电影网站
  4. Python实现箱形图的绘制
  5. 电商用户行为分析-大数据
  6. ls mac 显示最近修改日期_Mac命令行常用操作
  7. 如何将分表汇总到总表_EXCEL如何将分表中的数据汇总到总表 - 卡饭网
  8. kityminder-editor 百度脑图与my-mind 使用体验
  9. [Irving]SqlServer 拆分函数用法
  10. 2021.3.23 富途牛牛笔试