Go 1.19.4 错误处理-Day 11

news2024/9/22 10:25:36

1. 错误处理机制

1.1 先看一段代码,引出Golang错误处理机制

在这里插入图片描述

看到了上面的代码后,思考两个问题?
(1)有没有办法,能让test()执行出错了,它下面的fmt代码依然能够运行。
(2)即使出错,能不能发出提醒,并给出预警机制(如通知到具体的人)。

1.2 关于golang的错误处理

  1. Go在默认情况下,当发生错误后,程序会panic并退出运行(崩溃)。
  2. 如果希望,发生错误后,可以捕获到错误,并进行处理,且保证代码还能继续往下执行。甚至还能再捕获到错误后,给管理员一个提示(邮件、短信等)。
  3. 这里将引出go的错误处理机制。

1.3 基本说明

(1)Go语言追求简洁,所以不支持传统的try…catch…finally这种错误处理机制。
(2)Go中引入的错误处理方式为:defer、panic、recover。
(3)这几个异常使用的场景可以简单理解为:Go中报错一个panic异常,然后defer中通过recover捕获到这个异常,然后进行正常处理。

也就是说,panic、defer、recover三者是结合使用的。

2. 错误处理(panic后继续运行)

2.1 使用defer+recover处理和捕获异常(panic)

package main

import "fmt"

func test() {
	// 定义一个捕获异常的匿名函数
	defer func() {
		err := recover() //  recover是内置函数,可以捕获到异常
		if err != nil {
			fmt.Println("err=", err)
		}
	}()
	num1 := 10
	num2 := 0
	res := num1 / num2
	fmt.Println("res=", res)
}

func main() {
	test()
	fmt.Println("下面的代码和逻辑:")
}
============终端执行============
PS D:\个人\GO开发\20240624> go build main.go
PS D:\个人\GO开发\20240624> .\main.exe
err= runtime error: integer divide by zero // 报错了
下面的代码和逻辑: // 但是test()函数下面的代码依然执行了,说明程序没有因为panic而崩溃

2.2 错误处理的好处

进行错误处理后,程序不会轻易的挂掉,如果加入预警代码,还能让程序更加的健壮。
如下代码演示:

在这里插入图片描述

3. 自定义错误

在Go中,可以使用errors.New方法和panic内置函数来自定义错误。

  1. errors.New(“错误内容”),会返回一个error类型(是个接口)的值,表示一个错误。
  2. panic内置函数,接受一个any类型的值作为参数。可以接收error类型的变量,输出错误信息,并退出运行。

3.1 案例演示:检测文件名

3.1.1 文件名错误

package main

import (
	"errors"
	"fmt"
)

// 读取配置文件init.conf的信息,如果文件名传入不正确,就返回一个自定义的错误
func readConf(name string) (err error) {
	if name == "init.conf" {
		// 读取
		return nil // nil表示读取成功,没有错误
	} else {
		// 返回自定义错误
		return errors.New("读取文件名错误...")
	}
}

func test() {
	err := readConf("config.init") //这里传入了一个错误的文件名测试
	if err != nil {
		// 如果读取文件失败,就输出错误,并终止程序继续运行。
		panic(err)
	}
	fmt.Println("test函数调用成功,且后续代码继续执行")
}

func main() {
	test()
	fmt.Println("test函数后续的代码!!!")
}
============终端执行============
PS D:\个人\GO开发\20240624> go build main.go
PS D:\个人\GO开发\20240624> .\main.exe
panic: 读取文件名错误...

goroutine 1 [running]:
main.test()
        D:/个人/GO开发/20240624/main.go:23 +0x49
main.main()
        D:/个人/GO开发/20240624/main.go:29 +0x19

3.1.2 正确的文件名

package main

import (
	"errors"
	"fmt"
)

// 读取配置文件init.conf的信息,如果文件名传入不正确,就返回一个自定义的错误
func readConf(name string) (err error) {
	if name == "init.conf" {
		// 读取
		return nil // nil表示读取成功,没有错误
	} else {
		// 返回自定义错误
		return errors.New("读取文件名错误...")
	}
}

func test() {
	err := readConf("init.conf") // 这里改为正确的文件名
	if err != nil {
		// 如果读取文件失败,就输出错误,并终止程序继续运行。
		panic(err)
	}
	fmt.Println("test函数调用成功,且后续代码继续执行")
}

func main() {
	test()
	fmt.Println("test函数后续的代码!!!")
}
============终端执行============
PS D:\个人\GO开发\20240624> go build main.go
PS D:\个人\GO开发\20240624> .\main.exe       
test函数调用成功,且后续代码继续执行
test函数后续的代码!!!

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

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

相关文章

service 管理 web 管理插件

clusterIP 资源清单文件 [rootmaster ~]# kubectl create service clusterip websvc --tcp80:80 --dry-runclient -o yaml 解析域名 创建后端应用 负载均衡 固定 IP 服务 端口别名 nodePort 对外发布服务 Ingress 对外发布服务 查询 ingress 控制器类名称 kubectl g…

一个功能强大、易于使用的开源WEB表单构建工具Formbricks

大家好,今天给大家分享的是一个功能强大、易于使用的表单构建工具Formbricks,能够帮助开发者和非开发者快速构建各种类型的表单。 项目介绍 Formbricks 是一个开源的、基于 Web 的表单构建器,旨在帮助开发者和非开发人员轻松创建复杂的表单&…

大数据技术——Hadoop运行环境搭建

目录 一、 Hadoop运行环境搭建 1.1 模板虚拟机环境准备 1.2 克隆虚拟机 一、 Hadoop运行环境搭建 1.1 模板虚拟机环境准备 0)安装模板虚拟机,IP地址192.168.10.100、主机名称hadoop100、内存4G、硬盘50G 具体操作参照下列文档 大数据技术之模板虚…

8.15日学习打卡---Spring Cloud Alibaba(三)

8.15日学习打卡 目录: 8.15日学习打卡为什么需要服务网关Higress是什么安装DockerCompose部署Higress创建网关微服务模块Higress路由配置Higress策略配置-跨域配置Higress解决如何允许跨域Higress策略配置之什么是HTTP认证Higress策略配置-Basic 认证什么是JWT认证J…

腾讯云AI代码助手 —— 编程新体验,智能编码新纪元

阅读导航 引言一、开发环境介绍1. 支持的编程语言2. 支持的集成开发环境(IDE) 二、腾讯云AI代码助手使用实例1. 开发环境配置2. 代码补全功能使用💻自动生成单句代码💻自动生成整个代码块 3. 技术对话3. 规范/修复错误代码4. 智能…

C++ | stack/queue

前言 本篇博客讲解cSTL中的stack/queue 💓 个人主页:普通young man-CSDN博客 ⏩ 文章专栏:C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见📝 🎉欢迎大…

LMDeploy 量化部署实践闯关任务-50%的A100跑的过程

基础任务(完成此任务即完成闯关) 使用结合W4A16量化与kv cache量化的internlm2_5-7b-chat模型封装本地API并与大模型进行一次对话,作业截图需包括显存占用情况与大模型回复,参考4.1 API开发(优秀学员必做)使用Function call功能让…

docker compose部署rabbitmq集群,并使用haproxy负载均衡

一、创建rabbitmq的data目录 mkdir data mkdir data/rabbit1 mkdir data/rabbit2 mkdir data/rabbit3 二、创建.erlang.cookie文件(集群cookie用) echo "secretcookie" > .erlang.cookie 三、创建haproxy.cfg配置文件 global log stdout fo…

力扣 | 动态规划 | 动态规划在树的应用

文章目录 一、96. 不同的二叉搜索树二、95. 不同的二叉搜索树 II三、337. 打家劫舍 III 一、96. 不同的二叉搜索树 LeetCode:96. 不同的二叉搜索树 只求个数实际上比较简单,定义dp[i]表示结点个数为i的二叉搜索树的种树。(其实和记忆化搜索…

SpringBoot 自定义 starter

1. 官方文档 SpringBoot 版本 2.6.13,相关链接 Developing with Spring Boot 1.1 什么是 Starter Starters are a set of convenient dependency descriptors that you can include in your application. You get a one-stop shop for all the Spring and relate…

【Redis】数据结构篇

文章目录 键值对数据库是怎么实现的?动态字符串SDSC 语言字符串的缺陷SDS结构设计 整数集合整数集合结构设计整数集合的升级操作 哈希表哈希表结构设计哈希冲突链式哈希Rehash渐进式rehashrehash触发条件 压缩列表压缩列表结构设计连续更新压缩列表的缺陷 quicklist…

深入InnoDB核心:揭秘B+树在数据库索引中的高效应用

目录 一、索引页与数据行的紧密关联 (一)数据页的双向链表结构 (二)记录行的单向链表结构 二、未创建索引情况 (一)无索引下的单页查找过程 以主键为搜索条件 以非主键列为搜索条件 (二…

财务会计与管理会计(六)

文章目录 高端费用查询图表VLOOKUP函数应用一段简单的VBA代码的应用 入库税金的二维分析SUMPRODUCT函数的应用 多姿多彩的数据表MOD函数的应用和万能表的应用 判断取值与查找取值的关系INDEX与ATCH函数在查找取值中的应用 在职期间项目分布统计表IF函数的应用 自动填充序号应用…

安卓中Room持久化库的使用

在Android开发中,Room是Google提供的一个持久化库,旨在为应用提供SQLite的抽象层,以简化数据库的访问和操作。相比直接使用SQLite,Room提供更清晰、更简洁的数据库访问机制。 1. Room的基础知识 1.1 引入Room依赖 首先&#xff…

STM32CubeMX学习记录——配置定时器

文章目录 前言一、学习目的二、CubeMX配置三、代码编写 一、学习目的 在STM32学习中,定时器是一个非常重要的组成部分。本文将详细记录如何通过CubeMX工具配置定时器,以实现1ms的定时功能。(附计算公式) 二、CubeMX配置 &#xf…

锂电搅拌设备实现产线可视化

锂离子电池生产过程中的搅拌设备是确保电池性能与一致性的重要环节。随着智能制造和工业4.0概念的深入发展,实现锂电搅拌设备的产线可视化与信息化已成为提升生产效率、优化产品质量、降低运营成本的关键路径。这一转变不仅要求技术上的革新,还涉及到管理…

如何在 .NET 中实现 SM3withSM2 签名:详细步骤和示例代码

下面是一个详细的示例,展示如何在 .NET 中实现 SM3withSM2 签名和验证,包括生成密钥对、计算哈希、签名和验证。示例使用了 BouncyCastle 库,你可以根据实际需求对代码进行调整。 1. 安装依赖库 使用 NuGet 安装 BouncyCastle 库&#xff1a…

ThinkPHP5.0.15漏洞解析及SQL注入

第一步: 通过查看5.0.15和5.0.16版本的对比,可以看到16版本对在Builder.php里面对数据库的增减做了修正,所以可以15版本的漏洞就存在在这里。这里的代码用的拼接的方式,就可以尝试使用报错注入来实现。 第二步: 我们…

音视频开发继续学习

RGA模块 RGA模块定义 RGA模块是RV1126用于2D图像的裁剪、缩放、旋转、镜像、图片叠加等格式转换的模块。比方说:要把一个原分辨率1920 * 1080的视频压缩成1280 * 720的视频,此时就要用到RGA模块了。 RGA模块结构体定义 RGA区域属性结构体 imgType&am…

一文搞定SQLite数据库

文章目录 SQLite数据库一、SQLite简介1、简介2、SQLite特性3、适用场景4、不适用场景5、如何选择 二、SQLite安装1、下载2、安装 三、SQLite基本语法1、数据库操作①、新建数据库②、查看数据库③、查看帮助指令 2、表操作①、新增表②、查看表信息③、查看表索引信息④、查看表…