Golang错误处理机制

文章目录

  • Golang错误处理机制
    • panic异常
    • recover捕获异常
    • 自定义错误

Golang错误处理机制

panic异常

panic异常

  • Go的类型系统会在编译时捕获很多错误,但有些错误只能在运行时检查,比如除零错误、数组访问越界、空指针引用等,这些运行时错误会引起panic异常。
  • 当panic异常发生时,程序会中断运行,并立即执行当前函数中的defer语句,然后程序会从调用栈中逐级返回,返回同时执行各级函数中的defer语句,直到panic被捕获或程序终止。

例如,下面的代码在运行过程中,由于存在除零错误将导致panic异常。如下:

package mainimport "fmt"func Division(num1 int, num2 int) int {defer fmt.Println("Division defer...")return num1 / num2
}func main() {defer fmt.Println("main defer...")// panic异常result := Division(10, 0)fmt.Printf("result = %d\n", result)fmt.Println("other code...")
}

运行代码后可以看到,main函数中调用Division函数之后的代码没有被执行。但在程序退出之前,Division和main函数中的defer语句被逐一执行。如下:

在这里插入图片描述

recover捕获异常

recover捕获异常

  • 当触发panic异常时,我们希望程序可以继续运行,并希望在触发异常后,能够执行某些操作,比如给管理员发送一条告警信息。
  • 在Go中,捕获异常通过在defer中调用内建函数recover实现,recover函数会使程序从panic中恢复,并返回触发panic的值,如果程序没有发生panic,则recover调用将会返回nil。
  • 需要注意的是,当异常被捕获后,触发panic异常的函数也不会继续运行,但能正常返回。

例如,下面在Division函数的defer中捕获了panic异常,并将触发panic异常的值进行了返回。如下:

package mainimport "fmt"func Division(num1 int, num2 int) (result int, err error) {defer func() {if r := recover(); r != nil {err = r.(error) // 类型断言,将r转换为error类型(后续介绍)}}()return num1 / num2, nil
}func main() {// recover捕获异常result, err := Division(10, 0)if err != nil {fmt.Printf("division operation error, err = %v\n", err)} else {fmt.Printf("result = %d\n", result)}
}

运行代码后可以看到,由于panic异常被捕获使得Division函数正常返回,同时main函数后续的代码也被正常执行。如下:

在这里插入图片描述

由于panic异常会逐级抛出,直到异常被捕获或程序终止,因此可以选择在调用链的任意一个函数中对panic进行捕获。如下:

package mainimport "fmt"func Division(num1 int, num2 int) int {return num1 / num2
}func main() {// recover捕获异常defer func() {if err := recover(); err != nil {fmt.Printf("recoverd from panic, err = %v\n", err)}}()result := Division(10, 0)fmt.Printf("result = %d\n", result)fmt.Println("other code...")
}

由于Division函数中没有对panic进行捕获,导致main函数触发panic异常,虽然在main函数中对panic进行了捕获,但main函数的后续代码将不会被执行。如下:

在这里插入图片描述

自定义错误

自定义错误

  • 不是只有程序在运行时出现错误才能触发panic异常,通过调用内建函数panic也能触发panic异常。
  • panic函数能够接收任何类型的值作为参数,并在触发panic时将其作为触发panic的值。
  • 触发panic的值通常是error类型的,通过errors包中的New函数可以创建一个error类型的错误值,该函数接收一个string类型的参数,并返回创建的error类型的错误值。

例如,我们规定除数不能为20,否则触发panic异常。如下:

package mainimport ("errors""fmt"
)func Division(num1 int, num2 int) (result int, err error) {defer func() {if r := recover(); r != nil {err = r.(error)}}()if num2 == 20 {panic(errors.New("integer divide by 20"))}return num1 / num2, nil
}func main() {// recover捕获异常result, err := Division(10, 20)if err != nil {fmt.Printf("division operation error, err = %v\n", err)} else {fmt.Printf("result = %d\n", result)}
}

运行代码后可以看到,通过panic函数触发的异常也能够成功被捕获。如下:

在这里插入图片描述

说明一下: 通过recover将panic捕获后,可以继续通过调用panic函数将panic再次抛出,使其传播到更高层的调用栈进行进一步处理,这叫做异常的重新抛出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/660006.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

现代机器学习(ML)技术在医疗成像领域的新应用

现代机器学习(ML)技术在医疗成像领域的新应用主要包括以下几个方面: 一、自动病变检测 使用深度学习算法,尤其是卷积神经网络(CNN),自动识别和分类医学影像中的病变,如肿瘤、炎症等。自动病变检测是现代机器学习技术在医疗成像领域应用的一个重要方向。它主要通过以下…

esp32学习

开启自动补全功能 Arduino IDE 2.0开启代码补全及修改中文_arduino ide怎么设置中文-CSDN博客 PWM 、 ADC转换 在使用这个adc默认配置的时候adc引脚的输入电压必须是介于0-1之间,如何高于1v的电压都会视为一个最高值,如果要增加测量电压你就需要配置一…

RabbitMQ-死信队列

面试题:你们是如何保证消息不丢失的? 1、什么是死信 在 RabbitMQ 中充当主角的就是消息,在不同场景下,消息会有不同地表现。 死信就是消息在特定场景下的一种表现形式,这些场景包括: 1. 消息被拒绝访问&…

有哪些好用的局域网电脑监控系统软件?

企业员工不好管理??? 局域网已成为企业日常运营不可或缺的一部分。 然而,随着网络技术的普及,员工在局域网中的不当行为也日益增多,如滥用网络资源、泄露敏感信息、消极怠工等。 为了解决这些问题&#x…

【漫画生活中的项目管理】项目经理的五一出行清单~

五一到来之际,你是否做好假期出行攻略?五一假期,是探索世界的绝佳时机,是放松身心的美好时刻。 面对各地即将要“人从众”的旅游大军,完全不用担心玩不好!今年跟着项目经理学做小长假出行旅游规划&#xf…

【蓝桥杯C++A组省三 | 一场勇敢的征途与致19岁的信】

随着4.13西大四楼考场的倒计时结束… 就这样蓝桥杯落幕了 省三的名次既满足又不甘心,但又确乎说得上是19岁途中的又一枚勋章 从去年得知,纠结是否要报名、到寒假开始战战兢兢地准备、陆续开始创作博客,记录好题和成长……感谢你们的关注&…

PHP源码_最新Ai对话系统网站源码 ChatGPT+搭建教程+前后端

基于ChatGPT开发的一个人工智能技术驱动的自然语言处理工具,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,真正像人类一样来聊天交流,甚至能完成撰写邮件、视频脚本、文案、翻译、代码,写论…

Android中的屏幕刷新机制(动画视频形象说明机制)

一,刷新率和帧率,60hz和60fps的区别 在Android系统中,刷新率和帧率是两个不同的概念,它们各自在显示过程中扮演着不同的角色。以下是对它们的详细解释: 刷新率,单位是Hz,是指屏幕在一秒内刷新…

【35分钟掌握金融风控策略15】基于Swap Set分析新旧策略更替的影响

目录 基于Swap Set分析新旧策略更替的影响 Swap Set 简介 基于Swap Set 评估新旧策略效能 Swap in客群分析指标的近似估计 基于Swap Set分析新旧策略更替的影响 在贷前授信审批场景和贷中用信审批场景策略的日常调整中,通常是既做加法也做减法,即策…

解决Uncaught TypeError: Cannot read properties of null (reading ‘getAttribute‘)

问题: 用了element ui 的echart ,初始化时候找不到指定id的元素,导致的问题,如下 浏览器控制台输出的错误信息如下 Echars echarts.min.js:22 Uncaught TypeError: Cannot read properties of null (reading getAttribute)at echarts.min.…

Java 面向对象—重载和重写/覆盖(面试)

重载和重写/覆盖: 重载(overload): Java重载是发生在本类中的,允许同一个类中,有多个同名方法存在,方法名可以相同,方法参数的个数和类型不同,即要求形参列表不一致。重载…

39.WEB渗透测试-信息收集-域名、指纹收集(1)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:38.WEB渗透测试-信息收集-信息收集-企业信息收集(5) 子域名信息收…