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

【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 := 12num2 := 0result = num1 / num2fmt.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 Trueexcept 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 := 12num2 := 0result := num1 / num2fmt.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)// 这里设置默认值是99result = 99}else{fmt.Println("代码正常执行")}}()fmt.Println("------错误处理------")num1 := 12num2 := 0result = num1 / num2fmt.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 = 1if 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 = 1if num == 1{return 0, errors.New("num不能为1")}else{fmt.Println("num=", num)return num, nil}
}// 输出结果
------自定义错误------
0 num不能为1
程序有报错了
panic: num不能为1goroutine 1 [running]:
main.main()D:/07.go/02.gostudy/goproject/src/com/gdzs/main/main.go:67 +0x12e
exit status 2

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

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

相关文章

Windows Server 2012 IIS中发布ASP.NET CORE项目

服务器安装IIS&#xff1a; 微软官网下载SDK&#xff1a; 下载Runtime官网&#xff1a;https://dotnet.microsoft.com/download/dotnet-core 安装成功重启IIS&#xff1a; VS发布项目&#xff1a;

分享:如何做好Temu跨境电商项目的几点方法

Temu跨境电商项目作为中国电商巨头拼多多旗下的新兴跨境电商平台&#xff0c;近年来发展迅速&#xff0c;吸引了大量国内卖家参与。然而&#xff0c;由于跨境电商的复杂性和竞争激烈&#xff0c;如何在Temu平台上成功运营&#xff0c;实现良好的销售业绩&#xff0c;成为许多卖…

Chiplet技术与汽车芯片(二)

目录 1.回顾 2.Chiplet的优势 2.1 提升芯片良率、降本增效 2.2 设计灵活&#xff0c;降低设计成本 2.3 标准实行&#xff0c;构建生态 3.Chiplet如何上车 1.回顾 上一篇&#xff0c;我们将来芯粒到底是什么东西&#xff0c;本篇我们来看芯粒技术的优势&#xff0c;以及它…

软考39-上午题-【数据库】-关系代数运算1-传统的集合运算

一、笛卡尔积 二、关系代数 关系代数是施加于关系之上的集合代数运算。 关系代数包含&#xff1a; 传统的集合运算专门的关系运算 2-1、传统的集合运算 1、关系的并 示例&#xff1a; 2、关系的差 示例&#xff1a; 3、关系的交 示例&#xff1a; 关系的并、差、交&#xf…

一 . java语言概述——Java基础篇

一 . java语言概述——Java基础 发展阶段&#xff1a; 发行版本发行时间备注Java 1.01996.01.23Sun公司发布了Java的第一个开发工具包Java 1.11997.02.19JavaOne会议召开&#xff0c;创当时全球同类会议规模之最。Java 1.21998.12.08Java拆分成&#xff1a;J2SE&#xff08;标…

用户头像(图片文件)上传(Vue + nodejs 前后端)

文件上传&#xff08;图片上传&#xff09; 前端&#xff1a;Vue3 element-plus 后端&#xff1a;express 前端 封装一个 Upload 组件和一个 upload 方法。 Upload 组件 <!-- auto-upload 选择好图片后立刻自动上传后端还是手动点击某按钮上传后端 --><el-upload…

jax可微分编程的笔记(3)

jax可微分编程的笔记&#xff08;3&#xff09; 第3章 初识JAX JAX是Google开发的高性能数值计算和自动微分库&#xff0c;提供自动微分 即时编译和矢量并行化三大功能。JAX选择将函数编程的思想贯穿 始终。 简单来说&#xff0c;JAX库是GPU加速&#xff0c;支持自动微分的Nu…

android pdf框架-4,分析barteksc/PdfiumAndroid源码1

关于barteksc/PdfiumAndroid barteksc/PdfiumAndroid 这个源码被,引用的次数是比较高的,flutter的几个pdf库也是引用它.它使用福昕的开源sdk.福昕阅读器我早期的时候用,交互一般,渲染也不如mupdf,有些pdf中文显示不了,体积小点. barteksc/PdfiumAndroid已经是一个完善的sdk了,…

微信小程序开发(实战案例):本地生活 - 列表页面开发(动态渲染处理)、节流防抖(节流阀应用)

文章目录 本地生活 - 列表页面开发一、将九宫格分类换成navigator组件二、动态设置商品列表页的 title三、动态渲染商品列表页面四、上拉触底加载数据五、添加Loading加载效果六、数据加载节流防抖处理 本地生活 - 列表页面开发 导入我们上次写的 本地生活 - 首页开发的项目 运…

leetcode 50. Pow(x, n)

目录 函数定义&#xff1a; 2. 处理特殊情况&#xff1a; 3. 处理负指数&#xff1a; 4. 处理偶数指数&#xff1a; 5. 处理奇数指数&#xff1a; 时间复杂度 空间复杂度 class Solution { public:double myPow(double x, int n) {if(n 0){return 1;}if(n 1) return x…

C#设计模式---工厂方法模式

24种常用设计模式 创建型模式&#xff1a;抽象工厂、生成器、工厂方法、原型、单例&#xff1b; 结构型模式&#xff1a;适配器、桥接、组合、装饰、外观、享元、代理&#xff1b; 行为模式&#xff1a;责任链、命令、迭代器、中介者、备忘录、观察者、状态、策略、模板方法…

二分算法(c++版)

二分的本质是什么&#xff1f; 很多人会认为单调性是二分的本质&#xff0c;但其实其本质并非单调性&#xff0c;只是说&#xff0c;有单调性的可以进行二分&#xff0c;但是有些题目没有单调性我们也可以进行二分。其本质其实是一个边界问题&#xff0c;给定一个条件&#xf…

golang的map是如何扩容的【重点】

具体内容参考链接 https://zhuanlan.zhihu.com/p/616979764 Golang的map就是使用哈希表作为底层实现&#xff0c;map 实际上就是一个指针&#xff0c;指向hmap结构体。 Go 语言中的 map 在扩容时&#xff0c;会重新分配更大的内存空间&#xff0c;并将原有的键值对重新哈希到新…

【机器学习基础】一元线性回归(适合初学者的保姆级文章)

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a;机器学习 欢迎订阅&#xff01;后面的内容会越来越有意思~ &#x1f4a1;往期推荐&#xff1a; 【机器学习基础】机器学习入门&#xff08;1&#xff09; 【机器学习基…

python 函数-03-参数

入参不需要指定类型&#xff0c;只需要参数名称即可 【特殊性&#xff0c;区别于java c#等】传参两种方式&#xff1a; 位置参数 如 cube_volume(1, 2, 3) 关键字参数 如 cube_volume(width 1, height 2, length 3)参数为可变对象&#xff0c;如当参数为列表时&#xff0c;在…

趣学贝叶斯统计:条件概率(1)

前言 到目前为止&#xff0c;我们只讨论了独立事件的概率。当一个事件的结果不影响另一个事件的结果时&#xff0c;这两个事件就是独立事件。例如&#xff0c;掷硬币时出现正面并不影响掷骰子是否会掷出6点。计算独立事件的概率要比计算非独立事件的概率容易得多&#xff0c;但…

ES6 字符串面试题

如何判断字符串 “Hello, World!” 是否以 “Hello” 开头&#xff1f; 答案&#xff1a; const str "Hello, World!"; const startsWithHello str.startsWith("Hello"); console.log(startsWithHello); // 输出 true如何判断字符串 “Hello, World!” …

C 标准库 - <stdlib.h>

简介 <stdlib.h> 头文件定义了四个变量类型、一些宏和各种通用工具函数。 库变量 下面是头文件 stdlib.h 中定义的变量类型&#xff1a; 序号变量 & 描述1size_t2wchar_t3div_t4ldiv_t 库宏 下面是头文件 stdlib.h 中定义的宏&#xff1a; 序号宏 & 描述1…

conntrack-tools 内核依赖,

1 内核依赖 You require a Linux kernel version > 2.6.18. Connection Tracking System. CONFIG_NF_CONNTRACKm CONFIG_NF_CONNTRACK_IPV4m CONFIG_NF_CONNTRACK_IPV6m (if your setup supports IPv6) nfnetlink: the generic messaging interface for Netfilter. CONF…

【深度学习:标记数据】为医生标记数据缓解疼痛

【深度学习&#xff1a;标记数据】为医生标记数据缓解疼痛 问题实验结果结论 我开始在物理学方面进行学术研究&#xff0c;但在第一年就退学了&#xff08;抱歉&#xff0c;休学了&#xff09;我的博士学位&#xff0c;并在定量金融领域做了很长一段时间。因此&#xff0c;在我…