试了下Golang实现try catch的方法


Posted in Golang onJuly 01, 2021
目录
  • 前言
  • 能不能 try catch
  • 加入处理异常方法
  • 总结

前言

Golang语言有诸多优点:静态编译、协程、堪比c语言的高性能。

但是也有一些令人发指的地方 —— 经常被人调侃 五行代码,三行错误处理 的异常错误处理方式,如下问题出现的地方

func readFile(path string) ([]byte, error) {
    file, err := os.Open(path)
    if err != nil {
        return nil, err
    }
    defer file.Close()
    return ioutil.ReadAll(file)
}

函数readFile的功能是读出指定文件本身的内容并将其返回,同时当有错误发生时立即向调用方报告。
根据Golang编程范式,每个可能导致错误的函数都应该将error作为最后一个返回值,所以Golang代码中随处都是"if err != nil"语句。 五行代码,三行错误处理 的调侃段子由此在圈内流行

能不能 try catch

我之前常用编程语言 Python 和 PHP 的时候,早已经习惯 try catch 处理异常的方式。于是对 Golang 使用流程控制 配合 panic()、recover() 一直耿耿于怀,为了以后舒服今天就来实现一下原来 try catch异常错误处理方式

Golang 语言中拥有 recover() 函数作为宕机恢复机制,让程序在宕机流程中的 goroutine 中恢复。

所以我们能够用 recover() 函数作为程序中是否出现的钩子。当出现异常时,由它调起我们的异常处理函数。首先简单实现一下:

package main

import "fmt"

func try(userFn func()) {
 defer func() {
  if err := recover();err != nil{
   fmt.Printf("程序执行发生异常: %v\n", err)
  }
 }()

 userFn()
}

func foo(num int)  {
 if num < 10 {
  panic("number is less than 10")
 }else {
  panic("number is greater than 10")
 }
}

func main()  {
 try(func() {
  foo(9)
 })

 try(func() {
  foo(11)
 })
}

go run main.go 运行:

$ go run _test/demo3/test3.go
程序执行发生异常: number is less than 10
程序执行发生异常: number is greater than 10

从上可以看出,recover() 函数完成我们让它作为钩子,的作用,调起了打印 程序执行发生异常 的信息。

加入处理异常方法

捕抓到异常还需要处理异常,而不是简单打印 程序执行发生异常。所以还需要增加匿名方法作为异常处理方法,改造如下:

func try(userFn func(), catchFn func(err interface{})) {
 defer func() {
  if err := recover();err != nil{
   catchFn(err)
  }
 }()

 userFn()
}

...

func main()  {
 try(func() {
  foo(9)
 }, func(err interface{}) {
  fmt.Printf("程序执行发生异常: %v\n", err)
 })

 try(func() {
  foo(11)
 }, func(err interface{}) {
  fmt.Printf("程序执行发生异常: %v\n", err)
 })
}

这样就可以随心所欲传入自定义处理异常的方法

总结

以上只是自己简单实现了try catch,其中还有很多缺陷,比如:不支持 finally 函数处理,try catch封装过于简单。

到此这篇关于试了下Golang实现try catch的方法的文章就介绍到这了,更多相关Golang try catch内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Golang 相关文章推荐
golang如何去除多余空白字符(含制表符)
Apr 25 Golang
解决golang结构体tag编译错误的问题
May 02 Golang
Go标准容器之Ring的使用说明
May 05 Golang
基于Golang 高并发问题的解决方案
May 08 Golang
Go 语言下基于Redis分布式锁的实现方式
Jun 28 Golang
Go语言特点及基本数据类型使用详解
Mar 21 Golang
golang语言指针操作
Apr 14 Golang
golang用type-switch判断interface的实际存储类型
Apr 14 Golang
Golang解析JSON对象
Apr 30 Golang
Go语言编译原理之变量捕获
Aug 05 Golang
Python测试框架pytest核心库pluggy详解
Aug 05 Golang
go goth封装第三方认证库示例详解
Aug 14 Golang
Golang 语言控制并发 Goroutine的方法
Jun 30 #Golang
Golang的继承模拟实例
Jun 30 #Golang
go select编译期的优化处理逻辑使用场景分析
Go 语言下基于Redis分布式锁的实现方式
Jun 28 #Golang
go语言使用Casbin实现角色的权限控制
Go语言设计模式之结构型模式
浅谈Go语言多态的实现与interface使用
Jun 16 #Golang
You might like
mysql 字段类型说明
2007/04/27 PHP
PHP Switch 语句之学习笔记
2013/09/21 PHP
完善CodeIgniter在IDE中代码提示功能的方法
2014/07/19 PHP
php解析mht文件转换成html的实例
2017/03/13 PHP
自写的一个jQuery圆角插件
2010/10/26 Javascript
window.print打印指定div实例代码
2013/12/13 Javascript
JavaScript中的数学运算介绍
2014/12/29 Javascript
超详细的javascript数组方法汇总
2015/11/21 Javascript
BootStrap的alert提示框的关闭后再显示怎么解决
2016/05/17 Javascript
jQuery的实例及必知重要的jQuery选择器详解
2016/05/20 Javascript
深入理解jquery自定义动画animate()
2016/05/24 Javascript
jQuery实现鼠标经过购物车出现下拉框代码(推荐)
2016/07/21 Javascript
Javascript在IE和Firefox浏览器常见兼容性问题总结
2016/08/03 Javascript
JS按条件 serialize() 对应标签的使用方法
2017/07/24 Javascript
如何用原生js写一个弹窗消息提醒插件
2019/05/24 Javascript
[03:24]2014DOTA2国际邀请赛 神秘商店生意火爆
2014/07/18 DOTA
[01:05:52]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第一场 2月2日
2021/03/11 DOTA
Python采用Django开发自己的博客系统
2020/09/29 Python
ubuntu17.4下为python和python3装上pip的方法
2018/06/12 Python
将tensorflow的ckpt模型存储为npy的实例
2018/07/09 Python
Django处理多用户类型的方法介绍
2019/05/18 Python
Python接口测试文件上传实例解析
2020/05/22 Python
python3爬虫中引用Queue的实例讲解
2020/11/24 Python
英国领先的豪华时尚家居网上商店:Amara
2019/08/12 全球购物
Under Armour安德玛意大利官网:美国高端运动科技品牌
2020/01/16 全球购物
本科毕业生的求职信范文
2013/11/20 职场文书
培训讲师邀请函
2014/01/10 职场文书
西北政法大学自主招生自荐信
2014/01/29 职场文书
ktv好的活动方案
2014/08/15 职场文书
教师政风行风评议心得体会
2014/10/21 职场文书
2014年销售内勤工作总结
2014/12/01 职场文书
2016国庆节67周年寄语
2015/12/07 职场文书
2016三八妇女节校园广播稿
2015/12/17 职场文书
CSS3新特性详解(五):多列columns column-count和flex布局
2021/04/30 HTML / CSS
MySQL 重写查询语句的三种策略
2021/05/10 MySQL
Python进程池与进程锁之语法学习
2022/04/11 Python