go语言学习-异常处理

1、异常场景

  • 网络故障
  • 硬件故障
  • 组件故障
  • 输入错误
  • 逻辑错误
  • 链路调度错误

2、异常处理方式

# python或者java异常处理
try 可能出现的错误
catch对错误进行处理 
xxx,err := 代码
if err != nil {代码出现错误,需要做处理
}

3、自定义错误

有两种方法:1、通过errors包中的errors.New方法定义。 2、通过fmt.Errorf方法定义错误。

package mainimport ("errors""fmt"
)// 定义一个函数,用来实现除法
func division(i1, i2 float64) (res float64, err error) {fmt.Println("需要计算的数字是:", i1, i2)if i2 == 0 {return 0, errors.New("输入的分母不能为0")} else {res = i1 / i2return res, nil}
}func main() {// go 错误定义为一种类型,err = ccc// 像使用其他类型的变量一样,去处理我们的错误。// go打开一个本地文件。// 1. 打开这个文件 文件不存在  没有权限// 2. 写入内容/读取内容// f, err := ioutil.ReadFile("./text.txt")// if err != nil {// 	// 此时readfile报错,出现了问题// 	fmt.Println("读取文件内容失败:", err.Error())// } else {// 	fmt.Println(string(f))// }// 自定义errerr := errors.New("这是一个自定义错误")fmt.Println(err)err2 := fmt.Errorf("这是一个自定义错误: %s,它是使用fmt生成的", "这是错误内容")fmt.Println("这是一个使用fmt定义的错误:", err2.Error())// varres, err3 := division(2, 0)if err3 != nil {fmt.Println("计算错误:", err3.Error())} else {fmt.Println("计算结果:", res)}
}

4、程序异常终止

4.1 程序终止panic

panic:可以在异常的时候让程序终止执行,退出程序。或者是程序所强依赖的基础组件不可用。
此时程序已经无法继续正常工作,此时可以使用panic抛出异常,并且把程序退出。
切记:panic不能滥用,不能到处使用panic

package mainimport ("errors""fmt""time"
)// 实现数据库的链接
func connectDatabase(address string, port int) (string, error) {// 如果address和port为空if address == "" || port == 0 {return "", errors.New("无法链接数据库")} else {return "数据库链接成功", nil}
}func main() {s, err := connectDatabase("", 0)for {time.Sleep(5 * time.Second)// 模式启动程序if err != nil {// 说明无法链接数据库fmt.Println(err)panic(err) // 就会退出程序} else {// 链接成功fmt.Println(s)// 正常启动程序}}
}

4.2 defer 程序退出收尾处理

defer: 是go语言中的一种延迟调用机制,defer里面的内容可以在函数return之前或者是程序panic之前执行。
一般用于资源回收和数据返回,defer也可以用于异常时的恢复。
defer是可以有多个的,采用先进后出的机制。

package mainimport ("errors""fmt"
)// 实现数据库的链接
func connectDatabase(address string, port int) (string, error) {// 如果address和port为空if address == "" || port == 0 {return "", errors.New("无法链接数据库")} else {return "数据库链接成功", nil}
}// 返回数据给前端
func returnDataToFrontend(msg string) {fmt.Println("返回给前端的数据是:", msg)
}func main() {//比如一些常见的场景// 1. 关闭连接池// 2. 关闭文件句柄// 3. 记录一些异常日志msg := "返回给前端的数据"defer returnDataToFrontend("1")defer returnDataToFrontend("2")defer returnDataToFrontend("3")defer returnDataToFrontend("4")defer returnDataToFrontend(msg) // 不会真正的执行_, err := connectDatabase("", 0)if err != nil {fmt.Println(err)// retpanic(err)}// 返回数据给前端// returnDataToFrontend(msg)
}

5、异常捕获

package mainimport "fmt"func printSliceData(s []string) {// 使用recover进行异常捕获defer func() { // 匿名函数fmt.Println("程序执行失败, 捕获异常")if err := recover(); err != nil {// recover是用来捕获panic的报错的// 尝试恢复,防止程序异常退出fmt.Println("捕获到了一个错误:", err)// 发出一个告警// 记录一条日志// 返回给前端:说传入的值不对}}()fmt.Println("切片的内容:", s)// 打印一下切片的第三个值fmt.Println("切片的第三个值是:", s[2])
}func main() {// recover 异常的捕获和处理//s := []string{"a", "b"}printSliceData(s)}

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

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

相关文章

砖家测评:腾讯云标准型S5服务器和s6性能差异和租用价格

腾讯云服务器CVM标准型S5和S6有什么区别?都是标准型云服务器,标准型S5是次新一代云服务器规格,标准型S6是最新一代的云服务器,S6实例的CPU处理器主频性能要高于S5实例,同CPU内存配置下的标准型S6实例要比S5实例性能更好…

视频剪辑技巧:批量剪辑新篇章,AI智剪来领航

随着数字媒体的飞速发展,视频剪辑已经成为一项重要的工作。在繁忙的工作中,如何高效、准确地完成批量剪辑是一项具有挑战性的任务。近年来,AI智剪的出现为视频剪辑工作带来了新的解决方案,引领着批量剪辑的新篇章。在AI智剪的帮助…

为了摆脱 Android ,亚马逊开发基于Linux的操作系统

导读亚马逊一直在开发一种新的操作系统 —— 内部代号为 “Vega”,以便在 Fire TV、智能显示器和其他联网设备上取代 Android 系统。 亚马逊一直在开发一种新的操作系统 —— 内部代号为 “Vega”,以便在 Fire TV、智能显示器和其他联网设备上取代 Andr…

终于有人把数据资产入表知识地图总结出来了,轻松看懂

在当前数字化的浪潮下,数据已经成为劳动、土地、知识、技术以后的第五大生产要素,“数据就是资源”已成为共识。如今数据资产“入表”已成定局,数据资产化迫在眉睫。 2023年8月21日,财政部正式印发《企业数据资源相关会计处理暂行…

科技的成就(五十三)

503、任天堂首次公开 Switch 2016 年 10 月 20 日,任天堂首次公开 Switch 正式名称及造型。Switch 是任天堂推出的混合型游戏机,可作为家用游戏机,也可作为便携式掌机。Switch 在开发过程中就以代号 NX 而闻名,成为当年的现象级产…

什么样的企业可以使用免费版的CRM?

市面上大部分的免费CRM不需要付费即可使用,但是对于使用人数和功能进行了部分限制。下面我们就来说说,免费CRM的适用对象是谁? 1、初创/小微企业 这种小微企业没有太多的资金,也没有复杂的客户管理需求,仅仅需要一款…

生产环境_移动目标轨迹压缩应用和算法处理-Douglas-Peucker轨迹压缩算法

场景: 我目前设计到的场景是:以路面上行驶的汽车为例,即在地图应用中,对GPS轨迹数据进行压缩,减少数据传输和存储开销,因为轨迹点太频繁了,占用空间太大,运行节点太慢了&#xff0c…

设置ALPHA开发板通过tftp服务加载kernel与设备树文件

一. 简介 为了方便调试,开发板可以暂时设置为 从 ubuntu虚拟机下载 kernel 与设备树文件,并运行。 本文学习如何设置,设置方法具体就是更改 uboot源码中 bootcmd 与 bootargs参数。 二. 设置ALPHA开发板通过tftp服务加载kernel与设备树文…

姿态估计 手势动作实时识别项目(基于mediapipe、keras进行实现)

姿态估计 手势动作实时识别项目(基于mediapipe、keras进行实现) 0、功能展示1、项目原理介绍2、数据集采集脚本3、将采集到的动作数据集利用mediapipe库检测手部关键点信息,转换成数据信息保存到本地4、训练一个效果一般的随机森林分类器5、使用Kreas训练一个效果好点的全连…

提高软件测试覆盖率的5个重点

软件测试覆盖率是软件测试中的一个重要指标,它有利于保障软件质量、提高软件可靠性和可维护性。软件测试覆盖率能够发现并修复代码缺陷,确保代码的正确性,提高软件的稳定性,降低成本和风险。 因此进一步提高软件测试覆盖率对于软件…

Linux 之查看标准错误码工具

目录 1. Linux 之查看标准错误码工具 1. Linux 之查看标准错误码工具 $ sudo apt install moreutils$ errno -l EPERM 1 不允许的操作 ENOENT 2 没有那个文件或目录 ESRCH 3 没有那个进程 EINTR 4 被中断的系统调用 EIO 5 输入/输出错误 ENXIO 6 没有那个设备或地址 E2BIG 7 参…

Oauth2认证及Spring Security Oauth2授权码模式

Oauth2认证 Oauth2简介 简介 第三方认证技术方案最主要是解决认证协议的通用标准问题,因为要实现跨系统认证,各系统之间要遵循一定的接口协议。 OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。同时,任何第三方都可以使…

ICCV 23丨3D-VisTA:用于 3D 视觉和文本对齐的预训练Transformer

来源:投稿 作者:橡皮 编辑:学姐 论文链接:https://arxiv.org/abs/2308.04352 开源代码:http://3d-vista.github.io 摘要: 3D视觉语言标定(3D-VL)是一个新兴领域,旨在将…

类型体系与基本数据类型(第三节)

目录 前言 一、标量 1.1 类模板的声明 1.2 基于CPU的特化版本 1.3 标量的主体类型 前言 一个深度学习框架的初步实现为例,讨论如何在一个相对较大的项目中深入应用元编程,为系统优化提供更多的可能。 以下内容结合书中原文阅读最佳!&a…

centos7安装mysql8

打开Mysql下载页面 https://downloads.mysql.com/archives/community/ 选择版本号: centos选择Red Hat版本,复制地址 复制地址后,链接ssh,添加储存库 yum install 粘贴地址; yum install https://downloads.mysql…

人工智能基础_机器学习044_使用逻辑回归模型计算逻辑回归概率_以及_逻辑回归代码实现与手动计算概率对比---人工智能工作笔记0084

上面我们已经把逻辑回归的公式,以及,公式对应的图形都画画出来了,然后我们再来看看 如何用代码实现 可以看到上面是代码,咱们自己去写一下 import numpy as np from sklearn.linear_model import LogistieRegression from sklearn import datasets # 训练数据和测试数据拆分…

人工智能时代下的程序员核心竞争力:构建专属护城河

选题建议:《人工智能时代下的程序员核心竞争力:构建你的护城河》 大纲: I. 引言 A. 人工智能时代的发展趋势B. 程序员面临的挑战与机遇 I. 引言 A. 人工智能时代的发展趋势 随着科技的飞速进步,我们已经踏入了一个日新月异的人工…

Leetcode—2216.美化数组的最少删除数【中等】

2023每日刷题&#xff08;三十六&#xff09; Leetcode—2216.美化数组的最少删除数 实现代码 int minDeletion(int* nums, int numsSize) {int last nums[0], flag 1, ans 0;for(int i 1; i < numsSize; i) {if(flag) { // 前一个下标为偶数if(nums[i] last) {…

【CSS】min 和 max 函数(设置最大最小值)

文章目录 min() 函数&#xff1a;允许你从逗号分隔符表达式中选择一个最小值作为 CSS 的属性值 width: min(1vw, 4em, 80px);max() 函数&#xff1a;让你可以从一个逗号分隔的表达式列表中选择最大&#xff08;正方向&#xff09;的值作为属性的值 width: max(10vw, 4em, 80p…

Linux C 线程

线程 概述线程和进程的异同如何选择使用进程还是线程 函数获取进程自身ID  pthread_self创建线程  pthread_create退出线程  pthread_exit线程等待  pthread_join 四种线程模型1 &#xff09;单线程2 &#xff09;单线程3 &#xff09;双线程4 &#xff09;三线程 概述…