【GO语言卵细胞级别教程】07.捕获异常和自定义错误

news2025/1/17 16:02:32

【GO语言卵细胞级别教程】07.捕获异常和自定义错误

🥰博主:GokuCode
🥰微信公众号:【给点知识】分享小知识,快速成长,欢迎关注呀!(底部点击二维码)
🥰本项目演示代码仓库:https://gitee.com/gdzsfun/csdn-study-go 演示项目仓库
🥰本项目创建方式:【GO语言卵细胞级别教程】05.项目创建和函数讲解
🥰学习宗旨:活到老,学到老。
😍写作宗旨:致力于改变现有文章难读难懂问题。
CSDN互助

目录

    • 1简介
    • 2 详细介绍
    • 3 defer+recover异常捕获
  • 4.自定义错误
    • 4.1 介绍

1简介

程序中出现异常的时候可以进行不报错处理,继续执行程序

2 详细介绍

场景:我们写程序的时候难免会出现异常情况,比如如下的程序,出现了分母为0的情况,这个时候使用除法的时候会造成异常情况。

package mystudy
// 错误处理
import (
	"fmt"
)
func DemoErrorDetail()(result int){
	fmt.Println("------错误处理------")
	num1 := 12
	num2 := 0
	result = num1 / num2
	fmt.Println(result)
	return result
}

异常程序会出现异常报错如下信息:panic代表恐慌的意思,也就是go语言中的异常

panic: runtime error: integer divide by zero
goroutine 1 [running]:com.gdzs/goproject/src/com/gdzs/mystudy.DemoErrorDetail()	D:/07.go/02.gostudy/goproject/src/com/gdzs/mystudy/08.错误处理.go:11 +0x51
main.main()	D:/07.go/02.gostudy/goproject/src/com/gdzs/main/main.go:59 +0x51
*/

为了让程序不出现报错,那么我们需要处理下异常,就是让程序能够捕获异常,就像python程序一样

def test():
    try:
        print('python捕获异常', 100 / 0 )
        return True
     except Exception as e:
        return False

那么go的异常处理是怎么做的呢

3 defer+recover异常捕获

  1. go语言中使用defer+ recover函数实现异常的捕获,从而保证程序正常运行呢?
    使用defer + recover函数实现

func recover() interface{}

  1. 内建函数recover允许程序管理恐慌过程中的Go程序。
  2. 在defer的函数中,执行recover调用会取回传至panic调用的错误值,恢复正常执行,停止恐慌过程。
  3. 若recover在defer的函数之外被调用,它将不会停止恐慌过程序列。在此情况下,或当该Go程不在恐慌过程中时,或提供给panic的实参为nil时,recover就会返回nil。
package mystudy
// 错误处理
import "fmt"
func DemoErrorDetail(){
	// 捕获异常错误
	defer func(){
		if err := recover(); err != nil {
			fmt.Println("捕获到异常代码")
			fmt.Println("err:", err)
		}else{
		    fmt.Println("代码正常执行")
		}
	}()
	fmt.Println("------错误处理------")
	num1 := 12
	num2 := 0
	result := num1 / num2
	fmt.Println(result)
}

// 输出结果
------错误处理------
捕获到异常代码
err: runtime error: integer divide by zero

如果想要在执行过程中如果报错则返回默认值,如何设置.这里需要使用指定的返回值。

  1. 首先指定返回值 result, err
  2. 需要设置默认值的变量,在defer+recover中进行设置即可
package mystudy
// 错误处理
import (
	"fmt"
)
func DemoErrorDetail2() (result int, err error){
	// 捕获异常错误
	defer func(){
		if err := recover(); err != nil {
			fmt.Println("捕获到异常代码")
			fmt.Println("err:", err)
			// 这里设置默认值是99
			result = 99
		}else{
		    fmt.Println("代码正常执行")
		}
	}()
	fmt.Println("------错误处理------")
	num1 := 12
	num2 := 0
	result = num1 / num2
	fmt.Println(result)
	return result, nil
}
// 输出结果
------错误处理------
捕获到异常代码
err: runtime error: integer divide by zero
result= 99 err= <nil>

4.自定义错误

4.1 介绍

对于一些错误我想自定义,打印一些自己想执行的内容

  1. 使用error类型
  2. errors.New(“自定义错误内容”)
func SelfError()(int, error){
	fmt.Println("------自定义错误------")
	var num int = 1
	if num == 1{
		return 0, errors.New("num不能为1")
	}else{
		fmt.Println("num=", num)
		return num, nil
	}
}
// 调用函数
result, err := SelfError()
// 输出结果
------自定义错误------
0 num不能为1

在实际开发中可能有种情况是,如果某个程序报错了,就会影响接下来的运行,所有不继续执行程序,那么就可以使用panic

func SelfError()(int, error){
	fmt.Println("------自定义错误------")
	var num int = 1
	if num == 1{
		return 0, errors.New("num不能为1")
	}else{
		fmt.Println("num=", num)
		return num, nil
	}
}

// 输出结果
------自定义错误------
0 num不能为1
程序有报错了
panic: num不能为1

goroutine 1 [running]:
main.main()
        D:/07.go/02.gostudy/goproject/src/com/gdzs/main/main.go:67 +0x12e
exit status 2

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

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

相关文章

FL Studio 老用户免费更新FL Studio 21.2.3.4004 中文版及FL Studio 21更新日志

FL Studio 21是一款非常流行的数字音频工作站软件&#xff0c;它可以帮助音乐制作人和音乐爱好者创作出高质量的音乐作品。在FL Studio 21中&#xff0c;有许多插件可以帮助用户实现各种音乐效果&#xff0c;例如合成器、鼓机、效果器等等。 FL Studio 21.2.3.4004 加入了新的插…

学会字符转换

字符转换 题目描述&#xff1a;解法思路&#xff1a;解法代码&#xff1a;运行结果&#xff1a; 题目描述&#xff1a; 输入⼀一个字符串&#xff0c;将字符串中大写字母全部转为小写字母&#xff0c;小写字母转成大写字母&#xff0c;其他字符保持不变。注&#xff1a;字符串…

Python爬虫实战:图片爬取与保存

引言&#xff1a; 在本文中&#xff0c;我们将学习如何使用Python创建一个简单的图片爬虫。 我们将利用requests库来发送HTTP请求&#xff0c;BeautifulSoup库来解析HTML页面&#xff0c;以及os和shutil库来下载和保存图片。通过这个教程&#xff0c;你将学会如何爬取网…

【JavaScript 漫游】【021】EventTarget 接口

事件的本质是程序各个组成部分之间的一种通信方式&#xff0c;也是异步编程的一种实现。DOM 支持大量的事件。 EventTarget 接口概述 DOM 的事件操作&#xff08;监听和触发&#xff09;&#xff0c;都定义在 EventTarget 接口。所有节点对象都部署了这个接口&#xff0c;其他…

8.网络游戏逆向分析与漏洞攻防-游戏网络架构逆向分析-游戏底层功能对接类GameProc的实现

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;通过逆向分析确定游戏明文接收数据过程 码云地址&#xff08;master 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/titan 码云版本号&#xff1a;bcf7559184863febdcad819e48aaa…

选座位 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 疫情期间&#xff0c;需要大家保证一定的社交距离&#xff0c;公司组织开交流会议&#xff0c;座位有一排共N个座位&#xff0c;编号分别为[0…N-1]&#xff0c;要…

mvn版本导致的Failed to execute goal on project问题与解决

目录 一&#xff0c;报错情况与原因二&#xff0c;maven的下载与安装1&#xff0c;卸载maven2&#xff0c;安装mvn3&#xff0c;指定mvn的默认版本&#xff1a; 一&#xff0c;报错情况与原因 使用命令mvn package时会报如下错误&#xff1a; Failed to execute goal on proj…

关于js [GDOUCTF 2023]hate eat snake

查看页面源代码 发现snake.js文件 打开js文件 第7行定义了游戏的速度this.speed this.oldSpeed speed || 10 ; 全文搜索speed&#xff0c;在第237行发现自增代码this.speed; 注释或者删除自增代码 回到游戏页面 重玩游戏&#xff0c;等待60s即可 得到flag

C语言--贪吃蛇

目录 1. 实现目标2. 需掌握的技术3. Win32 API介绍控制台程序控制台屏幕上的坐标COORDGetStdHandleGetConsoleCursorinfoCONSOLE_CURSOR_INFOSetConsoleCursorInfoSetConsoleCursorPositionGetAsyncKeyState 4. 贪吃蛇游戏设计与分析地图<locale.h>本地化类项setlocale函…

matlab经验模式分解的R波检测算法

1、内容简介 略 56-可以交流、咨询、答疑 2、内容说明 略 心血管疾病是威胁人类生命的主要疾病之一&#xff0c;而心电信号&#xff08;electrocardiogram, ECG&#xff09; 则是评价心脏功能的主要依据&#xff0c;因此&#xff0c;关于心电信号检测处理的研究一直为各方所…

js设计模式:状态模式

作用: 将对象的行为和状态进行分离,状态是由行为操作决定的,而不是直接控制。 同时,行为也是由状态决定的,每个状态都有自己的行为和相应的方法 行为与状态分离,可以使代码方便维护 示例: <!DOCTYPE html> <html lang"en"><head><meta cha…

基于YOLOv5+PySide6的火灾火情火焰检测系统设计深度学习

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;225火灾 获取完整源码源文件已标注的数据集&#xff08;1553张&#xff09;配置跑起来说明 可有偿49yuan一对一远程操作&#xff0c;在你电脑跑起来 效果展示&#xff1a; ​数据集在下载的文件夹&#xff1a;yolov5-5.0\…

Vue3中的select 的option是多余的?

背景&#xff1a; 通过Vue3中填充一个下拉框&#xff0c;在打开页面时要指定默认选中&#xff0c;并在选项改变时把下拉框的选中值显示出来 问题&#xff1a; 填充通常的作法是设置 <option v-for"option in cities" :value"option.value" >&a…

软件测试中的测试左移与测试右移

在软件开发的过程中&#xff0c;测试是确保软件质量的一个至关重要的环节。随着软件开发方法的不断演进&#xff0c;测试也在不断地发展和改进。其中&#xff0c;测试左移&#xff08;Shift Left Testing&#xff09;和测试右移&#xff08;Shift Right Testing&#xff09;是两…

QlikSense CyberSecurity : Configuring preferred Cipher Suites

You can rank the preferred cipher suites that Qlik License Service uses to encrypt and decrypt the signed key license.您可以对Qlik许可证服务用于加密和解密签名密钥许可证的首选密码套件进行排序。 The Qlik License Service is included in Qlik Sense Enterprise …

【微服务生态】Dubbo

文章目录 一、概述二、Dubbo环境搭建-docker版三、Dubbo配置四、高可用4.1 zookeeper宕机与dubbo直连4.2 负载均衡 五、服务限流、服务降级、服务容错六、Dubbo 对比 OpenFeign 一、概述 Dubbo 是一款高性能、轻量级的开源Java RPC框架&#xff0c;它提供了三大核心能力&#…

Redis如何修改key名称

点击上方蓝字关注我 近期出现过多次修改Redis中key名字的场景&#xff0c;本次简介一下如何修改Redis中key名称的方法。 1. 命令行方式修改在Redis中&#xff0c;可以使用rename命令来修改Key的名称。这个命令的基本语法如下&#xff1a; RENAME old_key new_key 在这里&#…

2024年5月软考考试时间及考试安排

2024年5月软考考试时间&#xff1a;为5月25日到28日 考试采取科目连考、分批次考试的方式,连考的第一个科目作答结束交卷完成后自动进入第二个科目&#xff0c;第一个科目节余的时长可为第二个科目使用。 高级资格&#xff1a;综合知识科目考试时长150分钟&#xff0c;最短作…

代码随想录第41天|● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

文章目录 背包问题背包题目解法一 ● 01背包问题-二维数组五部曲1.确定dp数组2、确定递推公式3、初始化dp数组4、循环代码&#xff1a; 解法二-01背包问题-滚动数组五部曲1&#xff1a;定义dp二、递推公式三、初始化四、循环顺序代码&#xff1a; 698. 划分为k个相等的子集题解…

Mysql5.7主从复制搭建

注意不适用Mysql8 Docker搭建Mysql主从复制 docker run -p 3307:3306 --name mysql-master \ -v /usr/local/develop/mysql-master/log:/var/log/mysql \ -v /usr/local/develop/mysql-master/data:/var/lib/mysql \ -v /usr/local/develop/mysql-master/conf:/etc/mysql/con…