Go语言中的错误处理:使用自定义错误类型和panic/recover机制

package mainimport ("fmt"
)// 定义一个 DivideError 结构,用于表示除法错误
type DivideError struct {dividee int // 被除数divider int // 除数
}// 实现 `error` 接口
// 这个方法返回一个描述错误的字符串
func (de *DivideError) Error() string {strFormat := `无法进行除法运算,除数为零。被除数: %d除数: 0
`return fmt.Sprintf(strFormat, de.dividee)
}// 定义一个整数除法函数
// 使用 panic 和 recover 来处理除零错误
func Divide(varDividee int, varDivider int) (result int, err error) {// 使用 defer 和匿名函数来捕获 panicdefer func() {if r := recover(); r != nil {// 如果发生 panic,将其转换为 DivideErrorerr = &DivideError{dividee: varDividee,divider: varDivider,}}}()// 尝试进行除法运算result = varDividee / varDividerreturn result, nil
}func main() {// 正常情况:100 除以 10if result, err := Divide(100, 10); err == nil {fmt.Println("100/10 = ", result)}// 错误情况:100 除以 0if _, err := Divide(100, 0); err != nil {fmt.Println("错误信息是: ", err)}
}
# Go语言中的错误处理:使用自定义错误类型和panic/recover机制在Go语言中,错误处理是一个重要的概念。本文将通过一个整数除法的例子,展示如何使用自定义错误类型和panic/recover机制来处理错误。## 1. 自定义错误类型首先,我们定义一个自定义的错误类型 `DivideError`:```go
type DivideError struct {dividee int // 被除数divider int // 除数
}func (de *DivideError) Error() string {strFormat := `无法进行除法运算,除数为零。被除数: %d除数: 0
`return fmt.Sprintf(strFormat, de.dividee)
}

这个自定义错误类型实现了 error 接口,允许我们创建更具描述性的错误信息。

2. 使用panic/recover机制

接下来,我们实现 Divide 函数,使用panic/recover机制来处理除零错误:

func Divide(varDividee int, varDivider int) (result int, err error) {defer func() {if r := recover(); r != nil {err = &DivideError{dividee: varDividee,divider: varDivider,}}}()result = varDividee / varDividerreturn result, nil
}

这个函数使用了以下技巧:

  • defer 语句设置了一个在函数返回前执行的匿名函数。
  • 匿名函数使用 recover() 捕获可能发生的panic。
  • 如果捕获到panic,创建并返回一个 DivideError 实例。

3. 主函数

最后,我们在主函数中测试这个除法函数:

func main() {// 正常情况:100 除以 10if result, err := Divide(100, 10); err == nil {fmt.Println("100/10 = ", result)}// 错误情况:100 除以 0if _, err := Divide(100, 0); err != nil {fmt.Println("错误信息是: ", err)}
}

这个主函数展示了如何调用 Divide 函数并处理可能的错误。

完整代码

以下是完整的代码:

package mainimport ("fmt"
)type DivideError struct {dividee intdivider int
}func (de *DivideError) Error() string {strFormat := `无法进行除法运算,除数为零。被除数: %d除数: 0
`return fmt.Sprintf(strFormat, de.dividee)
}func Divide(varDividee int, varDivider int) (result int, err error) {defer func() {if r := recover(); r != nil {err = &DivideError{dividee: varDividee,divider: varDivider,}}}()result = varDividee / varDividerreturn result, nil
}func main() {if result, err := Divide(100, 10); err == nil {fmt.Println("100/10 = ", result)}if _, err := Divide(100, 0); err != nil {fmt.Println("错误信息是: ", err)}
}

总结

这个例子展示了Go语言中错误处理的两个重要方面:

  1. 自定义错误类型:允许创建更有意义的错误信息。
  2. panic/recover机制:提供了一种处理运行时错误的方法。

虽然这个例子展示了panic/recover的使用,但在实际应用中,Go社区通常更推荐使用显式的错误检查。panic/recover机制主要用于处理那些真正意外的、程序无法继续执行的情况。

通过这种方式,我们可以创建既强大又灵活的错误处理系统,同时保持代码的清晰度和可维护性。

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

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

相关文章

bash之基本运算符

一.算术运算符 vim test.sh #!/bin/basha10 b20valexpr $a $b echo "a b : $val"valexpr $a - $b echo "a - b : $val"valexpr $a \* $b echo "a * b : $val"valexpr $b / $a echo "b / a : $val"valexpr $b % $a echo "b % a …

TH-OCR:强大的光学字符识别工具与车牌识别应用

在当今数字化的时代,高效准确地识别文本和图像中的字符变得至关重要。TH-OCR(清华 OCR)作为一款优秀的光学字符识别软件,以其卓越的性能和广泛的应用场景,受到了众多用户的青睐。其中,车牌识别功能更是在交…

Discuz | 全站多国语言翻译和繁体本地转换插件 特色与介绍

Discuz全站多国语言翻译和繁体本地转换插件 特色与介绍 特殊:集成了2个开源库1.多国语言翻译 来自:github.com/xnx3/translate特色:无限使用接口 免费使用2个翻译端 带有一级和二级缓存 实现秒翻译 2.简体 繁体(台湾&#xff09…

【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,1-11

文件下载与邀请翻译者 学习英特尔开发手册,最好手里这个手册文件。原版是PDF文件。点击下方链接了解下载方法。 讲解下载英特尔开发手册的文章 翻译英特尔开发手册,会是一件耗时费力的工作。如果有愿意和我一起来做这件事的,那么&#xff…

在MySQL中为啥引入批量键访问(Batch Key Access, BKA)

批量键访问(Batch Key Access, BKA) 是 MySQL 在某些情况下用于优化 JOIN 操作的一种技术,特别是在通过索引进行 JOIN 时,它能有效减少查询的随机 I/O。批量键访问优化通过将一批主键或索引键一次性发送给存储引擎来查找匹配的行&…

HTML和CSS:构建现代网页的基础

HTML和CSS:构建现代网页的基础 HTML(HyperText Markup Language)和CSS(Cascading Style Sheets)是构建和设计网页的两种核心技术。HTML负责网页的结构和内容,而CSS则负责网页的样式和布局。了解这两种技术对于网页设计和开发至关重要。 HTML基础 HTML是一种标记语言,…

springboot项目多个数据源配置 dblink

当项目中涉及到多个数据库连接的时候该如何处理? 在对应的配置文件,配置对应的数据库情况,不过我确实没咋测试对于事务的处理我可以后续在多做测试 配置文件中配置对应的数据源 然后再使用的时候使用这个 DS(“pd_ob”)注解。 然后又长知识…

Oracle数据库 expdp导出表报错ORA-01555处理

–expdp导出某一张表的时候总是出现如下报错 ORA-02354: error in exporting/importing data ORA-01555: snapshot too old: rollback segment number with name "" too small ORA-22924: snapshot too old–在导出过程中观察undo的使用情况,发现并未占…

《计算机视觉》—— 基于dlib库的人检检测

文章目录 一、dlib库的安装1. 通过PyCharm的Settings安装2. 通过Anaconda安装(适用于Windows等操作系统)3. 通过命令行安装4.懒人安装 二、基于dlib库的人检测1.对图像进行人脸检测2.打开电脑摄像头,检测人脸 一、dlib库的安装 在PyCharm中&…

Vulnhub:Me-and-My-Girlfriend-1

一.环境启动/信息收集 (1)根据物理地址用nmap的主机发现功能得出IP地址 nmap -P 192.168.138.0/24 //同网段下主机发现得到IP为192.168.138.180(2)做nmap的目录扫描和端口扫描来发现其他站带以及信息 nmap -p- 192.168.138.180 …

使用CSS Flexbox创建简洁时间轴

使用CSS Flexbox创建简洁时间轴 在网页设计中,时间轴是一种常见且有效的方式来展示事件的顺序和进程。本文将介绍如何使用CSS Flexbox创建一个简洁优雅的时间轴,无需复杂的JavaScript代码。 基本HTML结构 首先,我们需要创建基本的HTML结构: html复制<div class"ti…

Ansible自动化工具

一、Ansible概述 1.1 什么是Ansible Ansible 是一个开源的自动化工具&#xff0c;用于配置管理、应用程序部署和任务自动化。它让你可以通过编写简单的 YAML 文件&#xff08;剧本&#xff0c;Playbooks&#xff09;&#xff0c;轻松管理和配置多个服务器。Ansible 的特点是无…

c#基础1

C#关键字 c#的静态类与c一样&#xff0c;不能够实例化&#xff0c;可以直接通过这个类调用内部的public方法和变量&#xff0c; partial 修饰的类可以分离内部的实现&#xff0c;可以定义在分散的文件中。 sealed修饰的类&#xff1a;类似于最终类&#xff0c;不能够被继承&…

深入了解 Flannel(3):vxlan在flannel中的作用

在 Flannel 中&#xff0c;VXLAN 主要用来解决以下问题&#xff1a; 1. 跨主机 Pod 之间的通信 问题&#xff1a;在 Kubernetes 集群中&#xff0c;Pod 通常分布在多个物理主机上。直接通过物理网络进行通信时&#xff0c;可能会面临 IP 地址冲突和路由问题。解决方案&#x…

[openwrt-21.02]openwrt-21.02 增加固件编译日期时间及git记录到openwrt_release文件

Openwrt版本 NAME="OpenWrt" VERSION="21.02-SNAPSHOT" ID="openwrt" ID_LIKE="lede openwrt" PRETTY_NAME="OpenWrt 21.02-SNAPSHOT" VERSION_ID="21.02-snapshot" HOME_URL="https://openwrt.org/" …

第十七周:机器学习笔记

第十七周周报 摘要Abstratc一、机器学习——生成式对抗网络&#xff08;Generative Adversarial Networks | GAN&#xff09;——&#xff08;中&#xff09;1. GAN 的理论介绍2. 用JS散度训练存在的问题3. WGAN 算法4. 拓展——流体 总结 摘要 本周周报主要对GAN进行了详细的…

【算法日记】 最大战力值

问题描述 疫情使得人们线下社交隔离&#xff0c;进而刺激了宅娱乐经济&#xff0c;令手机游戏市场份额再次创新纪录。一款手机游戏一般有很多角色&#xff0c;每个角色都可以设定一个战力值。为了平衡每个角色的能力&#xff0c;提升玩家的游戏体验&#xff0c;游戏策划往往会…

学习笔记——交换——STP(生成树)工作原理

三、工作原理 STP的基本原理是在一个有二层环路的网络中&#xff0c;交换机通过运行STP&#xff0c;自动生成一个没有环路的网络拓扑。这个无环网络拓扑也叫做STP树(STP Tree)&#xff0c;树节点为某些交换机&#xff0c;树枝为某些链路。当网络拓扑发生变化时&#xff0c;STP…

js简单基础笔记

一 . js特点 1. Js是一门解释型语言&#xff0c;不用编译&#xff0c;而是直接执行 2. js是一门动态语言&#xff0c;其中的任何内容都是不确定的 3. 语法结构和Java&#xff0c;c都很像 4. ​ js是一门面向对象的语言 5.js严格区分大小写 二 . js使用 1…

linux笔记(yum本地源仓库搭建)

一、准备工作 安装必要的软件包 在大多数 Linux 发行版中&#xff0c;Yum 已经默认安装。如果系统中没有安装&#xff0c;可以根据发行版的包管理器进行安装。 准备本地源文件 可以是光盘镜像&#xff08;如果是从光盘安装系统&#xff09;&#xff0c;或者是已经下载好的系…