【30天熟悉Go语言】10 Go异常处理机制

作者:秃秃爱健身,多平台博客专家,某大厂后端开发,个人IP起于源码分析文章 😋。
源码系列专栏:Spring MVC源码系列、Spring Boot源码系列、SpringCloud源码系列(含:Ribbon、Feign)、Nacos源码系列、RocketMQ源码系列、Spring Cloud Gateway使用到源码分析系列、分布式事务Seata使用到源码分析系列、JUC源码系列
基础系列专栏:30天熟悉GO语言(建设中)
码文不易,如果感觉博主的文章还不错,请点赞👍、收藏 ⭐️支持一下博主哇 🙏
联系方式:Saint9768,加我进技术交流群,一起学习进步📚、freedom✈️🌊

文章目录

  • 一、前言
  • 二、异常处理
    • 1)Go的异常处理机制
      • 1、defer关键字
      • 2、recover函数
      • 3、defer + recover 捕获异常示例
    • 2)自定义异常
      • 示例
    • 3)错误中断程序执行
  • 三、总结

一、前言

在这里插入图片描述

Go系列文章:

  1. GO开篇:手握Java走进Golang的世界
  2. 2 Go开发环境搭建、Hello World程序运行
  3. 3 Go编程规约和API包
  4. 4 Go的变量、常量、运算符
  5. 5 Go 基本数据类型
  6. 6 Go 复杂数据类型之指针
  7. 7 Go流程控制之分支结构if、switch
  8. 8 Go流程控制之循环结构for range、goto、break、continue
  9. Go函数全方位解析

Go专栏传送链接:https://blog.csdn.net/saintmm/category_12326997.html

二、异常处理

程序出现错误后,会被中断,无法继续执行。

package mainimport "fmt"func main() {testErrorHandle()fmt.Println("test函数执行成功")
}func testErrorHandle() {num1 := 10num2 := 0result := num1 / num2fmt.Println(result)
}

异常输出如下:
在这里插入图片描述

我们需要通过错误处理/异常捕获,使程序可以继续执行。

1)Go的异常处理机制

go追求代码优雅,通过defer + recover的方式实现异常处理机制,进而提高程序健壮性。

1、defer关键字

在golang中,程序遇到defer关键字,不会立即执行defer后的语句,而是将defer后的语句压入一个栈中,然后继续执行函数后面的逻辑。在函数执行完毕后,从栈中依次取出defer语句执行。

此外,defer关键字遵守FILO的特性,若多个defer函数在同一函数内,执行顺序遵循先进后出原理。即第一个defer函数最后一个被执行。

2、recover函数

recover是Go语言的内置函数,用于在发生 panic 后进行恢复,当 panic 发生时,程序会立即终止并开始执行对应的 recover 代码块。即:用于捕获函数错误。

在这里插入图片描述

3、defer + recover 捕获异常示例

通过recover()函数捕获到了异常,然后defer关键字将异常压入一个栈中,接着继续执行main()函数后面的逻辑,最后执行异常打印出来。

package mainimport "fmt"func main() {testErrorHandle()fmt.Println("test函数执行成功")
}func testErrorHandle() {// 使用defer + recover捕获异常;并直接调用匿名函数defer func() {// 调用recover内置函数捕获错误,如果没有可捕获的错误,recover()函数返回零值:nilerr := recover()if err != nil {fmt.Println("错误被捕获,error is ", err)}}()num1 := 10num2 := 0result := num1 / num2fmt.Println(result)
}

异常捕获:

在这里插入图片描述

2)自定义异常

使用需要调用errors包下的New()函数进行自定义异常,但是New()函数仅支持自定义一个字符串。
在这里插入图片描述

示例

package mainimport ("errors""fmt"
)func main() {err := customException()if err != nil {fmt.Println("自定义错误为:", err)}fmt.Println("test函数执行成功")
}// 函数的返回类型为error
func customException()(err error) {num1 := 10num2 := 0if num2 == 0 {// 抛出自定义异常return errors.New("除数不能为0")} else {// 正常执行result := num1 / num2fmt.Println(result)return nil}
}

控制台输出:
在这里插入图片描述

3)错误中断程序执行

一些场景,我们希望程序出现错误之后,后续代码不再执行,程序中断并退出。

我们可以使用builtin包下的panic()内置函数,中断程序的执行。

示例:

  • 当customException()函数返回异常信息之后,panic()函数将中断main()函数的执行。
package mainimport ("errors""fmt"
)func main() {err := customException()if err != nil {fmt.Println("自定义错误为:", err)// 中断程序的执行panic(err)}fmt.Println("test函数执行成功")
}// 函数的返回类型为error
func customException()(err error) {num1 := 10num2 := 0if num2 == 0 {// 抛出自定义异常return errors.New("除数不能为0")} else {// 正常执行result := num1 / num2fmt.Println(result)return nil}
}

控制台输出:
在这里插入图片描述

三、总结

Go的异常处理分三块:通过defer关键字 + recover()函数捕获异常、通过errors包下的New()函数自定义异常、通过panic()函数中断程序执行。

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

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

相关文章

[Linux]文件IO

文章目录 1. 文件描述符1.1 虚拟地址空间1.1.1 存在的意义1.1.2 分区 1.2 文件描述符1.2.1 文件描述符1.2.2 文件描述符表 2. Linux系统文件IO2.1 open/close2.1.1 函数原型2.1.2 close函数原型2.1.3 打开已存在文件2.1.4 创建新文件2.1.5 文件状态判断 2.2 read/write2.2.1 re…

Spring Boot(Vue3+ElementPlus+Axios+MyBatisPlus+Spring Boot 前后端分离)【四】

😀前言 本篇博文是关于Spring Boot(Vue3ElementPlusAxiosMyBatisPlusSpring Boot 前后端分离)【四】,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章…

VMware虚拟机连不上网络

固定ip地址 进入网络配置文件 cd /etc/sysconfig/network-scripts 打开文件 vi ifcfg-ens33 编辑 BOOTPROTO设置为static,有3个值(decp、none、static) BOOTPROTO"static" 打开网络 ONBOOT"yes" 固定ip IPADDR1…

为什么需要websocket?

一、为什么需要websocket? 前端和后端的交互模式最常见的就是前端发数据请求,从后端拿到数据后展示到页面中。如果前端不做操作,后端不能主动向前端推送数据,这也是http协议的缺陷。 因此,一种新的通信协议应运而生---…

【滑动窗口】leetcode1004:最大连续1的个数

一.题目描述 最大连续1的个数 这道题要我们找最大连续1的个数,看到“连续”二字,我们要想到滑动窗口的方法。滑动窗口的研究对象是一个连续的区间,这个区间需要满足某个条件。那么本题要找的是怎样的区间呢?是一个通过翻转0后得到…

抖音web主页视频爬虫

需要抖音主页视频爬虫源码的发私信,小偿即可获得长期有效的采集程序。 比构造 s_v_web_id 验证滑块的方法更快,更稳定。

JVM理论知识

一、JVM内存结构 java的内存模型主要分为5个部分,分别是:JVM堆、JVM栈、本地栈、方法区还有程序计数器,他们的用途分别是: JVM堆:新建的对象都会放在这里,他是JVM中所占内存最大的区域。他又分为新生区还…

2022年09月 C/C++(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;最长上升子序列 一个数的序列bi&#xff0c;当b1 < b2 < … < bS的时候&#xff0c;我们称这个序列是上升的。对于给定的一个序列(a1, a2, …, aN)&#xff0c;我们可以得到一些上升的子序列(ai1, ai2, …, aiK)&#xff0c;这里1 < i1 < i2 &…

【中危】Apache Ivy<2.5.2 存在XXE漏洞 (CVE-2022-46751)

漏洞描述 Apache Ivy 是一个管理基于 ANT 项目依赖关系的开源工具&#xff0c;文档类型定义(DTD)是一种文档类型定义语言,它用于定义XML文档中所包含的元素以及元素之间的关系。 Apache Ivy 2.5.2之前版本中&#xff0c;当解析自身配置、Ivy 文件或 Apache Maven 的 POM 文件…

设计模式--适配器模式(Adapter Pattern)

一、什么是适配器模式&#xff08;Adapter Pattern&#xff09; 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将一个类的接口转换成客户端所期望的另一个接口。适配器模式主要用于解决不兼容接口之间的问题&#xff0c;使得原本…

leetcode:338. 比特位计数(python3解法)

难度&#xff1a;简单 给你一个整数 n &#xff0c;对于 0 < i < n 中的每个 i &#xff0c;计算其二进制表示中 1 的个数 &#xff0c;返回一个长度为 n 1 的数组 ans 作为答案。 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;[0,1,1] 解释&#xff1a; 0…

RedisDesktopManager(redis客户端,可输入用户名密码)

RedisDesktopManager&#xff08;redis客户端&#xff0c;可输入用户名密码&#xff09; Redis桌面管理器&#xff08;又名RDM&#xff09; - 是一个用于Windows&#xff0c;Linux和MacOS的快速开源Redis数据库管理应用程序。可以使用url连接或账号密码。 redis设置账号密码后…

[论文阅读笔记26]Tracking Everything Everywhere All at Once

论文地址: 论文 代码地址: 代码 这是一篇效果极好的像素级跟踪的文章, 发表在ICCV2023, 可以非常好的应对遮挡等情形, 其根本的方法在于将2D点投影到一个伪3D(quasi-3D)空间, 然后再映射回去, 就可以在其他帧中得到稳定跟踪. 这篇文章的方法不是很好理解, 代码也刚开源, 做一…

嵌入式设备应用开发(发现需求和提升价值)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 很多做技术的同学,都会陷入到技术的窠臼之中。对于如何做具体的产品、实现具体的技术,他们可能很感兴趣。但是做出来的东西做什么用,或者说是有没有竞争力,事实上他们不是很关心…

身为一个后端程序员如何快速制作后端管理系统的UI

前言 我的专业领域在后端开发上&#xff0c;前端我仅仅是熟悉&#xff0c;但是要从头开发一个前端UI界面有点难为人了。那么身为一个后端程序员我们怎么来开发后端管理系统UI界面呢&#xff1f; 方案1&#xff1a;现成的模版来套&#xff08;有一定的前端基础&#xff0c;只是…

搭建开发环境-Mac

概述 上一篇搭建开发环境-WSLUbuntu 记录了WSL 和Ubuntu 下开发环境的搭建。这一篇就说下Mac开发环境的搭建。 就像很多人误以为Mini 是专为女孩子设计的高颜值车&#xff0c;其实是一辆极其hardcore 的拉力车一样。 很多人都被Mac 那高颜值蒙蔽了&#xff0c;其实这是一台生产…

基于swing的旅游管理系统java jsp旅行团信息mysql源代码

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 基于swing的旅游管理系统 系统有1权限&#xff1a;管…

flask获取请求对象的get和post参数

前言 get请求参数是在URL里面的&#xff0c;post请求参数是放在请求头里面的 get请求&#xff1a; index_page.route("/get") def get():var_a request.args.get("a", "jarvis")return "request:%s,params:%s,var_a:%s" %(request…

上传镜像到阿里云的ACR

1、开通阿里云ACR 2、在ACR 中创建命名空间 3、本地安装docker 4、登录到 开通ACR&#xff0c;需要配置访问凭证 [rootmaster ~]# docker login --username***lb registry.cn-beijing.aliyuncs.com Password: 5、给镜像打标签 [rootmaster ~]# docker images REPOSITORY …

【中危】Apache XML Graphics Batik<1.17 存在SSRF漏洞 (CVE-2022-44729)

zhi.oscs1024.com​​​​​ 漏洞类型SSRF发现时间2023-08-23漏洞等级中危MPS编号MPS-2022-63578CVE编号CVE-2022-44729漏洞影响广度极小 漏洞危害 OSCS 描述Apache XML Graphics Batik 是一个开源的、用于处理可缩放矢量图形(SVG)格式图像的工具库。 受影响版本中&#xff0…