试了下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:垃圾回收GC触发条件详解
Apr 24 Golang
Go语言-为什么返回值为接口类型,却返回结构体
Apr 24 Golang
用golang如何替换某个文件中的字符串
Apr 25 Golang
Go语言 go程释放操作(退出/销毁)
Apr 30 Golang
golang 实现Location跳转方式
May 02 Golang
浅谈GO中的Channel以及死锁的造成
Mar 18 Golang
简单聊聊Golang中defer预计算参数
Mar 25 Golang
golang的文件创建及读写操作
Apr 14 Golang
Golang实现可重入锁的示例代码
May 25 Golang
Go 内联优化让程序员爱不释手
Jun 21 Golang
Go微服务项目配置文件的定义和读取示例详解
Jun 21 Golang
Go gorilla securecookie库的安装使用详解
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
解析PHP正则提取或替换img标记属性
2013/06/26 PHP
PHP文件去掉PHP注释空格的函数分析(PHP代码压缩)
2013/07/02 PHP
PHP扩展Memcache分布式部署方案
2015/12/06 PHP
PHP substr()函数参数解释及用法讲解
2017/11/23 PHP
jQuery TextBox自动完成条
2009/07/22 Javascript
javascript转换字符串为dom对象(字符串动态创建dom)
2010/05/10 Javascript
js实现点击后将文字或图片复制到剪贴板的方法
2014/08/04 Javascript
jQuery 1.9.1源码分析系列(十四)之常用jQuery工具
2015/12/02 Javascript
基于JQuery的$.ajax方法进行异步请求导致页面闪烁的解决办法
2016/05/10 Javascript
JS跨域请求外部服务器的资源
2017/02/06 Javascript
JavaScript实现鼠标点击导航栏变色特效
2017/02/08 Javascript
easyui datagrid 表格中操作栏 按钮图标不显示的解决方法
2017/07/27 Javascript
elemetUi 组件--el-upload实现上传Excel文件的实例
2017/10/27 Javascript
angularjs $http调用接口的方式详解
2018/08/13 Javascript
postman自定义函数实现 时间函数的思路详解
2019/04/17 Javascript
jQuery实现简易聊天框
2020/02/08 jQuery
Vue项目结合Vue-layer实现弹框式编辑功能(实例代码)
2020/03/11 Javascript
javaScript实现一个队列的方法
2020/07/14 Javascript
[00:32]2018DOTA2亚洲邀请赛Mineski出场
2018/04/04 DOTA
编程语言Python的发展史
2014/09/26 Python
python搭建服务器实现两个Android客户端间收发消息
2018/04/12 Python
用python处理MS Word的实例讲解
2018/05/08 Python
解决python读取几千万行的大表内存问题
2018/06/26 Python
Python二叉树的镜像转换实现方法示例
2019/03/06 Python
Django对models里的objects的使用详解
2019/08/17 Python
详解向scrapy中的spider传递参数的几种方法(2种)
2020/09/28 Python
基于html5 canvas实现漫天飞雪效果实例
2014/09/10 HTML / CSS
刊首寄语大全
2014/04/11 职场文书
班主任对学生的评语
2014/04/26 职场文书
学期评语大全
2014/04/30 职场文书
货物运输服务质量承诺书
2014/05/29 职场文书
离婚起诉书范文2015
2015/05/19 职场文书
2015年城市管理工作总结
2015/05/23 职场文书
2015年社区精神文明工作总结
2015/05/26 职场文书
2016三严三实专题教育活动心得体会
2016/01/06 职场文书
Python 读取千万级数据自动写入 MySQL 数据库
2022/06/28 Python