来一个除以0的异常,代码如下:

package mainimport "fmt"func main() {fmt.Println("before")divNum()fmt.Println("after")
}func divNum() {num1 := 10num2 := 0result := num1 / num2fmt.Println(result)
}

console 异常:

before
panic: runtime error: integer divide by zerogoroutine 1 [running]:
main.divNum()C:/Users/Lenovo/IdeaProjects/go-helloworld/class02/demo06/main.go:15 +0x11
main.main()C:/Users/Lenovo/IdeaProjects/go-helloworld/class02/demo06/main.go:8 +0x5b
exit status 2

恐慌: 运行时 整数除以零的恐慌。

before 输出后,遇到恐慌异常,代码运行时,因为错误恐慌中断,后面的代码 after并没有执行出来。常常我们不想程序的代码流就这么在运行时就中断掉,就需要引入一些技术,错误能被捕获并处理掉。

在java中有try...catch...finally 来处理异常,在Go中,为了追求代码的优雅,采用的是defer...recover来处理这里的恐慌panic 。

defer recover 机制处理错误:

defer 前面学过了,但是什么是recover函数?

官方解释及有道翻译:

        The recover built-in function allows a program to manage behavior of a panicking goroutine. 内置包的recover函数允许程序管理恐慌goroutine go程序 的行为。Executing a call to recover inside a deferred function (but not any function called by it) stops the panicking sequence by restoring normal execution and retrieves the error value passed to the call of panic. 在延迟函数(而不是它调用的任何函数)内部执行恢复调用,通过恢复正常执行来停止恐慌序列,并检索传递给panic调用的错误值。If recover is called outside the deferred function it will not stop a panicking sequence.如果在deferred函数外部调用recover,则不会停止恐慌序列。In this case, or when the goroutine is not panicking, or if the argument supplied to panic was nil, recover returns nil. Thus the return value from recover reports whether the goroutine is panicking.在这种情况下,或者当goroutine没有panic,或者提供给panic的参数为nil时,recover将返回nil。因此,recover的返回值报告goroutine是否出现异常。这里,nil是零值,返回nil 则说明 goroutine 有错误。 代码如下:
package mainimport "fmt"func main() {fmt.Println("before")divNum()fmt.Println("after")
}func divNum() {//利用defer + recover 捕获错误// 1.defer 后加一个匿名函数调用。defer func() {// 2.匿名函数内开一个局部变量,看 recover返回是 nil 还是错误。。err := recover() //3.如果recover 返回的不是零,说明goroutine有错误,打印该错误。if err != nil {fmt.Println(err)}}()num1 := 10num2 := 0result := num1 / num2fmt.Println(result)
}
查看 console 输出:
before
runtime error: integer divide by zero
after
Go语言的自定义错误:由于 runtime error: integer divide by zero 对我们不是很友好,看下Go语言是如何支持自定义错误的。自定义错误,需要调用errors包瞎的New函数进行操作,函数会返回一个error类型。
package mainimport ("errors""fmt"
)func main() {fmt.Println("before")err := divNum()if err != nil {fmt.Println(err)}fmt.Println("after")
}func divNum() (err error) {num1 := 10num2 := 0// 抛出自定义错误。if num2 == 0 {err := errors.New("除数不能为0")return err} else {result := num1 / num2fmt.Println(result)return nil}}
上面发生错误,程序正常执行了,有时候,我们希望发生错误,程序停止执行。

panic(err) //抛出异常,停止代码流。相当于java 中的new Exception();

package mainimport ("errors""fmt"
)func main() {fmt.Println("before")err := divNum()if err != nil {fmt.Println(err)panic(err) //抛出异常,停止代码流。相当于java 中的new Exception();}fmt.Println("after")
}func divNum() (err error) {num1 := 10num2 := 0// 抛出自定义错误。if num2 == 0 {err := errors.New("除数不能为0")return err} else {result := num1 / num2fmt.Println(result)return nil}}
That's all , next point ...

Golang入门笔记(14)—— 错误处理相关推荐

  1. Python入门笔记(17):错误、异常

    一.什么是错误,什么是异常,它们两者区别 这里解释如下:个人觉得很通俗易懂 错误是指在执行代码过程中发生的事件,它中断或干扰代码的正常流程并创建异常对象.当错误中断流程时,该程序将尝试寻找异常处理程序 ...

  2. Golang 入门笔记(二)下

    目录 文章目录 目录 修改字符串 连接字符串 格式化 格式表 BASE64编码 常量 枚举--一组常量值 类型别名与类型定义 非本地类型不能定义方法 在结构体成员嵌入时使用别名 紧接上文 修改字符串 ...

  3. Golang 入门笔记(一)

    初识 Go 语言 本章主要介绍了以下内容: Go 语言的特性: (2)使用 Go 语言的开源项目: (3)安装 Go 语言开发包和搭建其开发环境. 目录 文章目录 初识 Go 语言 目录 s1 Go语 ...

  4. golang入门笔记——kitex

    文章目录 WSL的安装 Kitex Kitex的准备工作 创建IDL文件 生成代码 一个问题以及解决 客户端的调用 链路追踪 为什么需要链路追踪 OpenTelemetry链路追踪 服务注册与发现 W ...

  5. 【机器学习入门笔记14:BP神经网络基础】20190218

    2019-02-18  by 崔斐然 讲解1:创建最简单的神经网络 整个神经网络分为3层, 第一层:输入层: 输入层矩阵(15行1列) 第二层:隐藏层(中间层): 隐藏层1行10列 第三次:输出层 输 ...

  6. Golang 入门笔记(二)中

    目录 文章目录 目录 转换不同的数据类型 指针 指针地址和指针类型 使用指针修改值 使用指针变量获取命令行的输入信息 创建指针 new() 变量生命期 栈 堆 变量逃逸 字符串应用 计算字符串长度 遍 ...

  7. Golang 入门笔记(二)上

    目录 文章目录 目录 Go 语言基本语法与使用 2.1 变量 2.1.1 声明变量 2.1.2 初始化变量 2.1.3 多个变量同时赋值 2.1.4 匿名变量---没有名字的变量 2.2 数据类型 整 ...

  8. golang入门笔记—ES

    ES参考网站 ES的介绍: Elasticsearch(ES)是一个基于Lucene构建的开源.分布式.RESTful接口的全文搜索引擎.Elasticsearch还是一个分布式文档数据库,其中每个字 ...

  9. golang入门笔记—结构体

    //type后面跟的是类型 type myInt int //自定义类型,%T输出为main.myInt type yourInt=int//类型别名,只是在代码编写过程中起作用 var n myIn ...

最新文章

  1. 边缘检测、Hough变换、轮廓提取、种子填充、轮廓跟踪
  2. poj1741(树的点分治)
  3. 骨架提取的MATLAB实现
  4. 常用netbeans快捷键
  5. js+css立体旋转
  6. Linux启动SAP服务,sap启动相关
  7. 16 CO配置-控制-产品成本控制-产品成本计划编制-定义成本构成结构
  8. 1337. 矩阵中战斗力最弱的 K 行
  9. java单元测试模拟输入_java – 单元测试:在定义模拟行为后调用...
  10. input 函数的输入和输出
  11. java使用python爬虫,如何使用 Python 爬虫爬取 Java 题库?
  12. 模块参考资料-Cat.1模块选型手册-
  13. rpm包的下载安装与使用---手把手教学
  14. 点陶极速版《隐私政策》
  15. 天堂2java报错_那位高手帮我解决一下天堂2单机的服务器问题
  16. swift-集成touch id功能 指纹验证
  17. 【genius_platform软件平台开发】第九十三讲:串口通信(485通信)
  18. 【算法练习】数据结构/图论 poj4084:拓扑排序
  19. ZZULIOJ:1135: 算菜价
  20. BeanFactory和ApplicationContext的区别

热门文章

  1. 《天赋》:第一章 天赋
  2. Oracle comment添加注释
  3. ZYNQ产品生产拷机问题思考
  4. Vue+ .netcore3.1 模拟QQ邮箱发送验证码
  5. 解决uniapp用了textarea标签设置了边框,右边边框溢出手机屏幕问题
  6. 找回密码功能实现步骤
  7. 三位一撇:处理数字12345.67——12,345.67
  8. 层次短语模型学习笔记
  9. 【征文大赛】TiDB 社区第二届征文大赛,一次性带走社区全部新周边,还有bose 降噪耳机、倍轻松按摩仪等你拿!
  10. Windows 2000进程细述.