Golang学习笔记_23——error补充

Golang学习笔记_20——error
Golang学习笔记_21——Reader
Golang学习笔记_22——Reader示例


文章目录

    • error补充
      • 1. 基本错误处理
      • 2. 自定义错误
      • 3. 错误类型判断
        • 3.1 类型断言
        • 3.2 类型选择
      • 4. panic && recover
    • 源码


error补充

1. 基本错误处理

在Go中,函数通常返回两个值:一个是预期的结果,另一个是error类型的值。
如果函数执行过程中发生错误,error值将不为nil

func divide(a, b float64) (float64, error) {if b == 0 {return 0, errors.New("division by zero")}return a / b, nil
}func error_demo_1() {// 调用 divide 函数进行除法运算result, err := divide(10, 0)if err != nil {// 处理错误println("Error:", err)} else {// 输出结果println("Result:", result)}
}

测试方法

func Test_error_demo_1(t *testing.T) {error_demo_1()
}

输出结果

=== RUN   Test_error_demo_1
Error: (0x105134bc8,0x1400009ef48)
--- PASS: Test_error_demo_1 (0.00s)
PASS

2. 自定义错误

自定义错误类型可以实现error接口,该接口仅包含一个Error方法,返回一个字符串。

// 自定义错误
type MyError2 struct {When stringwhat string
}func (e *MyError2) Error() string {return fmt.Sprintf("when: %s, what: %s", e.When, e.what)
}func testMyError() error {err := &MyError2{When: "now",what: "something wrong",}return err
}

测试方法

func Test_testMyError(t *testing.T) {if err := testMyError(); err != nil {fmt.Println(err)}
}

输出结果

=== RUN   Test_testMyError
when: now, what: something wrong
--- PASS: Test_testMyError (0.00s)
PASS

3. 错误类型判断

3.1 类型断言
// MyError2 是自定义错误类型func ErrorAssertDemo() error {err := &MyError2{When: "now",what: "something wrong",}return err
}func TestErrorAssertDemo() {err := ErrorAssertDemo()if specificErr := err.(*MyError2); specificErr != nil {fmt.Println("specificErr:", specificErr)} else {fmt.Println("normalErr:", err)}
}

测试方法

func Test_ErrorAssertDemo(t *testing.T) {TestErrorAssertDemo()
}

输出结果

=== RUN   Test_ErrorAssertDemo
specificErr: when: now, what: something wrong
--- PASS: Test_ErrorAssertDemo (0.00s)
PASS
3.2 类型选择
// 错误类型选择
// MyError2 是自定义错误类型
func ErrorTypeDemo1() error {return &MyError2{When: "now",what: "myError wrong",}
}func ErrorTypeDemo2() error {return errors.New("normal wrong")
}func switchErrorDemo(err error) {if err != nil {switch err1 := err.(type) {case *MyError2:fmt.Println("myError2:", err1)default:fmt.Println("normal:", err1)}}
}func TestErrorTypeDemo() {err1 := ErrorTypeDemo1()err2 := ErrorTypeDemo2()switchErrorDemo(err1)switchErrorDemo(err2)
}

测试方法

func Test_ErrorTypeDemo(t *testing.T) {TestErrorTypeDemo()
}

输出结果

=== RUN   Test_ErrorTypeDemo
myError2: when: now, what: myError wrong
normal: normal wrong
--- PASS: Test_ErrorTypeDemo (0.00s)
PASS

4. panic && recover

在Go中,panic用于表示一个不可恢复的运行时错误。当panic发生时,程序将停止正常执行,并开始逐级调用已注册的延迟函数(deferred functions),随后程序崩溃。
recover是一个内置函数,用于从panic中恢复。它只能在延迟函数中调用。在正常的执行路径中调用recover将返回nil

// panic 和 recover
func myPanic() {panic("error happened")
}func safeRecover() {defer func() {if err := recover(); err != nil {fmt.Println("recover:", err)}}()myPanic()
}

测试方法

func Test_safeRecover(t *testing.T) {safeRecover()fmt.Println("after recover")}

输出结果

=== RUN   Test_safeRecover
recover: error happened
after recover
--- PASS: Test_safeRecover (0.00s)
PASS

源码

// error_demo_2.go 文件
package error_demoimport ("errors""fmt"
)func divide(a, b float64) (float64, error) {if b == 0 {return 0, errors.New("division by zero")}return a / b, nil
}func errorDemo1() {// 调用 divide 函数进行除法运算result, err := divide(10, 0)if err != nil {// 处理错误println("Error:", err)} else {// 输出结果println("Result:", result)}
}// 自定义错误
type MyError2 struct {When stringwhat string
}func (e *MyError2) Error() string {return fmt.Sprintf("when: %s, what: %s", e.When, e.what)
}func testMyError() error {err := &MyError2{When: "now",what: "something wrong",}return err
}func ErrorAssertDemo() error {err := &MyError2{When: "now",what: "something wrong",}return err
}func TestErrorAssertDemo() {err := ErrorAssertDemo()if specificErr := err.(*MyError2); specificErr != nil {fmt.Println("specificErr:", specificErr)} else {fmt.Println("normalErr:", err)}
}// 类型选择
func ErrorTypeDemo1() error {return &MyError2{When: "now",what: "myError wrong",}
}func ErrorTypeDemo2() error {return errors.New("normal wrong")
}func switchErrorDemo(err error) {if err != nil {switch err1 := err.(type) {case *MyError2:fmt.Println("myError2:", err1)default:fmt.Println("normal:", err1)}}
}func TestErrorTypeDemo() {err1 := ErrorTypeDemo1()err2 := ErrorTypeDemo2()switchErrorDemo(err1)switchErrorDemo(err2)
}// panic 和 recoverfunc myPanic() {panic("error happened")
}func safeRecover() {defer func() {if err := recover(); err != nil {fmt.Println("recover:", err)}}()myPanic()
}
// error_demo_2_test.go 文件
package error_demoimport ("fmt""testing"
)func Test_error_demo_1(t *testing.T) {errorDemo1()
}func Test_testMyError(t *testing.T) {if err := testMyError(); err != nil {fmt.Println(err)}
}func Test_ErrorAssertDemo(t *testing.T) {TestErrorAssertDemo()
}func Test_ErrorTypeDemo(t *testing.T) {TestErrorTypeDemo()
}func Test_safeRecover(t *testing.T) {safeRecover()fmt.Println("after recover")}

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

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

相关文章

Python中的asyncio:高效的异步编程模型

随着互联网应用的快速发展,程序的响应性和处理效率成为衡量系统性能的重要指标。传统的同步编程模型在面对高并发和IO密集型任务时,常常显得捉襟见肘,难以满足现代应用的需求。Python的asyncio库作为一种高效的异步编程模型,为开发…

JavaScript -- 数组详解(使用频率高)【数组专题】

文章目录 前言一、创建数组1.1 使用Array构造函数1.2 使用数组字面量表示法1.3 ES6语法转换数组1.3.1 from( )用于将类数组结构转换为数组实例1.3.2 of( )用于将一组参数转换为数组实例 二、数组常用方法2.1 复制和填充2.1.1 copyWithin( )2.1.2 fill( ) 2.2 数组转换2.2.1 toS…

操作系统之文件系统的基本概念

目录 用户和磁盘视角的文件 文件控制块(FCB)和索引结点(inode) 文件的操作 创建文件(create系统调用) 写文件(write系统调用) 读文件(read系统调用) 重…

如何制作一份出色的公司介绍PPT?

制作一份公司介绍的PPT需要精心设计,以确保内容既专业又吸引人。以下是一个基本的框架和一些建议,帮助您创建一份有效的公司介绍PPT: PPT标题页 标题:公司全称(可使用公司Logo作为背景或嵌入标题中)副标题…

springboot项目部署至linux

1.修改pom.xml 确认是否有以下代码&#xff0c;没有请进行添加&#xff0c;mainClass改成你的启动类 <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.ve…

vue.js 使用router-link替代a标签实现高亮

在Vue.js中&#xff0c;可以使用<router-link>组件来替代<a>标签实现高亮效果。<router-link>是Vue-Router提供的组件&#xff0c;用于路由导航。 首先&#xff0c;需要在Vue项目中安装Vue-Router。可以使用以下命令安装&#xff1a; npm install vue-rout…

FPGA随记——时钟时序一些基本知识

原文链接&#xff1a;跨时钟域设计-CSDN博客 前言 CDC&#xff08;clock domain crossing&#xff09;检查&#xff08;跨时钟域的检查&#xff09;是对电路设计中同步电路设计的检查。非同步时钟没有固定的相位关系&#xff0c;这样Setup/Hold不满足而产生了亚稳态是无法避免…

实例解析网络钓鱼攻击的幕后

网络钓鱼是通过大量发送声称来自于银行或其他知名机构的欺骗性垃圾邮件&#xff0c;意图引诱收信人给出敏感信息&#xff08;如用户名、口令、帐号ID、ATM PIN码或信用卡详细信息&#xff09;的一种攻击方式。最典型的网络钓鱼攻击将收信人引诱到一个通过精心设计与目标组织的网…

STM32+WIFI获取网络时间+8位数码管显示+0.96OLED显

资料下载地址&#xff1a;STM32WIFI获取网络时间8位数码管显示0.96OLED 1、项目介绍 主控芯片STM32C8T6 接线&#xff1a;串口1&#xff1a;PA9 PA10 OELD &#xff1a;PB6 PB7 数码管使用&#xff1a;MAX7219 8位数码管 Max7219_pinCLK PAout(5) Max7219_pinC…

1688平台商品关键词搜索的多样性与Python爬虫应用实践

在当今这个信息化、数字化飞速发展的时代&#xff0c;电子商务平台已经成为人们日常生活中不可或缺的一部分。而1688作为国内知名的B2B电商平台&#xff0c;凭借其庞大的商品种类和丰富的供应链资源&#xff0c;为无数商家和消费者提供了便捷的交易渠道。除了广受关注的女装品类…

记录将springboot的jar包和lib分离,使用docker-compose部署

本文讲诉如何把jar里的lib依赖包独立出来&#xff0c;方便更新服务时&#xff0c;缩小jar的体积&#xff0c;下面以若依的system服务为例&#xff0c;配置中的路径请酌情修改&#xff0c;主要提供大致配置逻辑 第一步&#xff1a;修改项目的pom.xml&#xff0c;调整build的配…

如何解决Redis中的热点key问题

Redis中的热点Key问题是指某些特定的Key被频繁访问&#xff0c;导致Redis中某个节点&#xff08;或实例&#xff09;承担过高的压力&#xff0c;可能引发性能瓶颈&#xff0c;甚至若缓存承受不住服务压力挂掉后&#xff0c;仍有大量请求时直接打到DB上&#xff0c;由于DB层相对…

单片机实现模式转换

[任务] 要求通过单片机实现以下功能&#xff1a; 1.单片机有三种工作模式(定义全局变量MM表示模式&#xff0c;MM1&#xff0c;2&#xff0c;3表示三种不同的模式) LED控制模式 风扇控制模式 蜂鸣器控制模式 2.可以在某一个模式下通过拓展板KEY1按键控制设备 (按…

安卓OCR使用(Google ML Kit)

OCR是一个很常用的功能&#xff0c;Google ML Kit提供了OCR能力&#xff0c;用起来也很简单&#xff0c;本文介绍一下使用方法。 1. 相关概念 名词概念解释TextBlock块一个段落Line行一行文本Element元素单词&#xff1b;对汉字来说&#xff0c;类似"开头 (分隔符)中间&…

数据库(3)--针对列的CRUD操作

1.Create 新增 语法&#xff1a; insert into 表名 &#xff08;列名&#xff09;values &#xff08;列&#xff09;... 创建一个学生表用于演示&#xff1a; create table if not exists student( id bigint comment 编号, name varchar(20) comment 姓名 ); 1.1直接增加…

【设计模式-1】软件设计模式概述

1. 软件设计模式的产生背景 “设计模式”这个术语最初并不是出现在软件设计中&#xff0c;而是被用于建筑领域的设计中。 1977 年&#xff0c;美国著名建筑大师、加利福尼亚大学伯克利分校环境结构中心主任克里斯托夫亚历山大&#xff08;Christopher Alexander&#xff09;在…

Python爬虫基础——认识网页结构(各种标签的使用)

1、添加<div>标签的代码定义了两个区块的宽度和高度均为100px&#xff0c;边框的格式也相同&#xff0c;只是区块中显示的内容不同&#xff1b; 2、添加<ul>和<ol>标签分别用于定义无序列表和有序列表。<il>标签位于<ul>标签或<ol>标签之…

Spring boot接入xxl-job

Spring boot接入xxl-job 导入maven包加入配置增加配置类创建执行器类&#xff08;写job的业务逻辑&#xff09;去控制台中配置job 导入maven包 <dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>…

[Git] git pull --rebase / git rebase origin/master

1. git pull --rebase 这个命令是用来更新当前分支的&#xff0c;它会从远程仓库拉取更新&#xff0c;然后将你的本地提交重新应用到更新后的基础之上。它相当于先执行 git fetch&#xff0c;然后在当前分支上执行 git rebase origin/。使用 --rebase 而不是默认的 merge 可以…

去掉el-table中自带的边框线

1.问题:el-table中自带的边框线 2.解决后的效果: 3.分析:明明在el-table中没有添加border,但是会出现边框线. 可能的原因: 由 Element UI 的默认样式或者表格的某些内置样式引起的。比如,<el-table> 会通过 border-collapse 或 border-spacing 等属性影响边框的显示。 4…