试了下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 相关文章推荐
Go语言带缓冲的通道实现
Apr 26 Golang
golang 如何通过反射创建新对象
Apr 28 Golang
golang 如何用反射reflect操作结构体
Apr 28 Golang
彻底理解golang中什么是nil
Apr 29 Golang
golang 接口嵌套实现复用的操作
Apr 29 Golang
Go遍历struct,map,slice的实现
Jun 13 Golang
go goroutine 怎样进行错误处理
Jul 16 Golang
Golang表示枚举类型的详细讲解
Sep 04 Golang
Go语言基础map用法及示例详解
Nov 17 Golang
Golang MatrixOne使用介绍和汇编语法
Apr 19 Golang
Golang 结构体数据集合
Apr 22 Golang
Go gorilla/sessions库安装使用
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
老机欣赏|中国60年代精品收音机
2021/03/02 无线电
FCKeditor添加自定义按钮
2008/03/27 PHP
php数组总结篇(一)
2008/09/30 PHP
用PHP+MySQL搭建聊天室功能实例代码
2012/08/20 PHP
PHP 关于访问控制的和运算符优先级介绍
2013/07/08 PHP
PHP中开启gzip压缩的2种方法
2015/01/31 PHP
自动生成文章摘要的代码[JavaScript 版本]
2007/03/20 Javascript
用cookies实现的可记忆的样式切换效果代码下载
2007/12/24 Javascript
javascript getElementsByClassName函数
2010/04/01 Javascript
Javascript实现Web颜色值转换
2015/02/05 Javascript
每天一篇javascript学习小结(属性定义方法)
2015/11/19 Javascript
jQuery实现的纵向下拉菜单实例详解【附demo源码下载】
2016/07/09 Javascript
Vue 短信验证码组件开发详解
2017/02/14 Javascript
jQuery常见面试题之DOM操作详析
2017/07/05 jQuery
Vue上传组件vue Simple Uploader的用法示例
2017/08/25 Javascript
JS设计模式之状态模式概念与用法分析
2018/02/05 Javascript
详解vue项目接入微信JSSDK的坑
2018/12/14 Javascript
使用Angular9和TypeScript开发RPG游戏的方法
2020/03/25 Javascript
JavaScript异步操作的几种常见处理方法实例总结
2020/05/11 Javascript
基于canvas实现手写签名(vue)
2020/05/21 Javascript
JS如何实现在弹出窗口中加载页面
2020/12/03 Javascript
[40:06]DOTA2亚洲邀请赛 4.3 突围赛 Liquid vs VGJ.T 第一场
2018/04/04 DOTA
[01:18:36]LGD vs VP Supermajor 败者组决赛 BO3 第一场 6.10
2018/07/04 DOTA
[50:34]VGJ.T vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python遍历文件夹并删除特定格式文件的示例
2014/03/05 Python
Python使用三种方法实现PCA算法
2017/12/12 Python
Python使用base64模块进行二进制数据编码详解
2018/01/11 Python
Python使用Phantomjs截屏网页的方法
2018/05/17 Python
Django如何自定义分页
2018/09/25 Python
python找出因数与质因数的方法
2019/07/25 Python
django连接oracle时setting 配置方法
2019/08/29 Python
关于Pytorch MaxUnpool2d中size操作方式
2020/01/03 Python
项目合作计划书
2014/01/09 职场文书
宿舍保安职务说明书
2014/02/25 职场文书
婚礼主持词开场白
2014/03/13 职场文书
2015新年寄语(一句话)
2014/12/08 职场文书