试了下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 interface{}==nil 的几种坑及原理分析
Apr 24 Golang
golang 如何用反射reflect操作结构体
Apr 28 Golang
彻底理解golang中什么是nil
Apr 29 Golang
解决Golang time.Parse和time.Format的时区问题
Apr 29 Golang
go设置多个GOPATH的方式
May 05 Golang
golang switch语句的灵活写法介绍
May 06 Golang
基于Go语言构建RESTful API服务
Jul 25 Golang
Golang使用Panic与Recover进行错误捕获
Mar 22 Golang
Go语言的协程上下文的几个方法和用法
Apr 11 Golang
GO语言异常处理分析 err接口及defer延迟
Apr 14 Golang
Golang获取List列表元素的四种方式
Apr 20 Golang
Go语言编译原理之源码调试
Aug 05 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
php 文件上传实例代码
2012/04/19 PHP
PHP中提问频率最高的11个面试题和答案
2014/09/02 PHP
laravel 5异常错误:FatalErrorException in Handler.php line 38的解决
2017/10/12 PHP
jcrop基本参数一览
2013/07/16 Javascript
利用JS判断用户是否上网(连接网络)
2013/12/23 Javascript
JavaScript使用delete删除数组元素用法示例【数组长度不变】
2017/01/17 Javascript
浅谈es6中export和export default的作用及区别
2018/02/07 Javascript
Vue2.2.0+新特性整理及注意事项
2018/08/22 Javascript
vue中axios请求的封装实例代码
2019/03/23 Javascript
详解vue中v-bind:style效果的自定义指令
2020/01/21 Javascript
vscode 配置vue+vetur+eslint+prettier自动格式化功能
2020/03/23 Javascript
JavaScript函数重载操作实例浅析
2020/05/02 Javascript
vue 项目中当访问路由不存在的时候默认访问404页面操作
2020/08/31 Javascript
[01:09]DOTA2次级职业联赛 - ishow.HMM战队宣传片
2014/12/01 DOTA
[01:02:47]EG vs Secret 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
python 多线程应用介绍
2012/12/19 Python
python的多重继承的理解
2017/08/06 Python
Python实现压缩和解压缩ZIP文件的方法分析
2017/09/28 Python
Anaconda下安装mysql-python的包实例
2018/06/11 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
2019/03/01 Python
python实现批量视频分帧、保存视频帧
2019/05/31 Python
python代码如何实现余弦相似性计算
2020/02/09 Python
python 实现批量图片识别并翻译
2020/11/02 Python
Python实现PS滤镜中的USM锐化效果
2020/12/04 Python
介绍一下HTTP、HTTPS和SSL
2012/12/16 面试题
大唐面试试题(CPU,UNIX等等)
2012/01/11 面试题
公司财务流程之主管工作流程
2014/03/03 职场文书
教师个人自我评价
2015/03/04 职场文书
护士自荐信范文(2016推荐篇)
2016/01/28 职场文书
《分数的意义》教学反思
2016/02/20 职场文书
CSS完成视差滚动效果
2021/04/27 HTML / CSS
Python实战之OpenCV实现猫脸检测
2021/06/26 Python
python获取对象信息的实例详解
2021/07/07 Python
手把手教你使用TensorFlow2实现RNN
2021/07/15 Python
JavaScript实现优先级队列
2021/12/06 Javascript
Python Matplotlib绘制两个Y轴图像
2022/04/13 Python