Golang入门笔记(14)—— 错误处理

news2025/8/11 14:12:00

        来一个除以0的异常,代码如下:

package main

import "fmt"

func main() {

	fmt.Println("before")
	divNum()
	fmt.Println("after")
}

func divNum() {
	num1 := 10
	num2 := 0
	result := num1 / num2
	fmt.Println(result)
}

        console 异常:

before
panic: runtime error: integer divide by zero

goroutine 1 [running]:
main.divNum()
        C:/Users/Lenovo/IdeaProjects/go-helloworld/class02/demo06/main.go:15 +0x11
main.main()
        C:/Users/Lenovo/IdeaProjects/go-helloworld/class02/demo06/main.go:8 +0x5b
exit status 2

        恐慌: 运行时 整数除以零的恐慌。

        before 输出后,遇到恐慌异常,代码运行时,因为错误恐慌中断,后面的代码 after并没有执行出来。常常我们不想程序的代码流就这么在运行时就中断掉,就需要引入一些技术,错误能被捕获并处理掉。

        在java中有try...catch...finally 来处理异常,在Go中,为了追求代码的优雅,采用的是defer...recover来处理这里的恐慌panic 。

defer recover 机制处理错误:

              defer 前面学过了,但是什么是recover函数?

        官方解释及有道翻译:

        The recover built-in function allows a program to manage behavior of a panicking goroutine. 内置包的recover函数允许程序管理恐慌goroutine go程序 的行为。
        Executing a call to recover inside a deferred function (but not any function called by it) stops the panicking sequence by restoring normal execution and retrieves the error value passed to the call of panic. 在延迟函数(而不是它调用的任何函数)内部执行恢复调用,通过恢复正常执行来停止恐慌序列,并检索传递给panic调用的错误值。
        If recover is called outside the deferred function it will not stop a panicking sequence.如果在deferred函数外部调用recover,则不会停止恐慌序列。
        In this case, or when the goroutine is not panicking, or if the argument supplied to panic was nil, recover returns nil. Thus the return value from recover reports whether the goroutine is panicking.在这种情况下,或者当goroutine没有panic,或者提供给panic的参数为nil时,recover将返回nil。因此,recover的返回值报告goroutine是否出现异常。

这里,nil是零值,返回nil 则说明 goroutine 有错误。 代码如下:
package main

import "fmt"

func main() {

	fmt.Println("before")
	divNum()
	fmt.Println("after")
}

func divNum() {

	//利用defer + recover 捕获错误

	// 1.defer 后加一个匿名函数调用。
	defer func() {
		// 2.匿名函数内开一个局部变量,看 recover返回是 nil 还是错误。。
		err := recover() 
		//3.如果recover 返回的不是零,说明goroutine有错误,打印该错误。
		if err != nil {
			fmt.Println(err)
		}
	}()

	num1 := 10
	num2 := 0
	result := num1 / num2
	fmt.Println(result)
}
查看 console 输出:
before
runtime error: integer divide by zero
after
Go语言的自定义错误:
        由于 runtime error: integer divide by zero 对我们不是很友好,看下Go语言是如何支持自定义错误的。
       自定义错误,需要调用errors包瞎的New函数进行操作,函数会返回一个error类型。
package main

import (
	"errors"
	"fmt"
)

func main() {

	fmt.Println("before")
	err := divNum()
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println("after")
}

func divNum() (err error) {

	num1 := 10
	num2 := 0

	// 抛出自定义错误。
	if num2 == 0 {
		err := errors.New("除数不能为0")
		return err
	} else {
		result := num1 / num2
		fmt.Println(result)
		return nil
	}

}
上面发生错误,程序正常执行了,有时候,我们希望发生错误,程序停止执行。

        panic(err) //抛出异常,停止代码流。相当于java 中的new Exception();

package main

import (
	"errors"
	"fmt"
)

func main() {

	fmt.Println("before")
	err := divNum()
	if err != nil {
		fmt.Println(err)
		panic(err) //抛出异常,停止代码流。相当于java 中的new Exception();
	}
	fmt.Println("after")
}

func divNum() (err error) {

	num1 := 10
	num2 := 0

	// 抛出自定义错误。
	if num2 == 0 {
		err := errors.New("除数不能为0")
		return err
	} else {
		result := num1 / num2
		fmt.Println(result)
		return nil
	}

}
        That's all , next point ...

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

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

相关文章

GitHub 昙花一现:《Spring Boot 趣味实战》神作开源几分钟被下架

又来给大家分享好书了:刘水镜老师的 Spring Boot 趣味实战,网上依旧是没有开源版本!文末送上 刘水镜是谁? 十余年持续技术文章输出,CSDN 博客专家。2020 年《 Spring Boot 趣味私房课》专栏上线,凭借风趣…

创新案例|巴黎欧莱雅如何以内容+货架双轮驱动全渠道兴趣电商增长飞轮

对巴黎欧莱雅而言,兴趣电商作为内容场景为核心的平台,但货架场景已成为驱动增长的飞轮。巴黎欧莱雅团队注意到,抖音用户不只是被动地接受信息流推送,而是越来越倾向于主动搜索。消费者行为的重大变革意味着消费者不再满足于货找人…

【MFC】初识MFC(8)

MFC简介 微软提供的一个类库(Class Libraries),封装了Windows的API,并且包含一个应用程序框架。 1、MFC是对前面窗口编程所用到的API进行封装,在Windows C基础上引入了C面向对象的思想,简单而言就是把API…

【论文翻译】2.5PC:一个更快的非阻塞原子提交协议

2.5-PC: A Faster and Non-Blocking Atomic Commit Protocol 目录1 介绍2 相关工作3 原子承诺和 3PC 概述4 为什么 3PC 是非阻塞的?5 2.5 PC6 2.5 PC 的非正式证明7 确认信息8 2.5 PC 机器证明参考摘要:我们提出 2.5PC,一种非阻塞原子提交协…

DNS与网站访问流程

1:dns与网址url简介 DNS是域名系统(DomainNameSystem)的缩写,域名系统是一中庞大而复杂的系统,但我们这里讲解重心并不是这个系统,而是指本地电脑dns是什么 讲到dns,我们就不得不讲讲网址和域名,我们经常会…

linux杀死进程的五种方法(kill)

添加链接描述 相关博主的链接; 方法一:通过kill 进程id的方式可以实现 首先需要知道进程id, 例如,想要杀死firefox的进程,通过 ps -ef|grep firefox,可以查到firefox的进程id: 然后通过 kill 3781 就可以关闭进程了. 补充: kill -9 来强制终止退出, 例…

16.一篇文章学会django模型的使用

1.django模型简单示例 1.1 创建django项目 创建完项目,还需要创建django子项目 django-admin startproject model_study cd .\model_study\ python manage.py startapp model_app1.2配置应用 将模型对应的应用程序(刚刚创建的子应用)添加…

CentOS 7 Jenkins配置及SpringBoot项目自动部署

1.下载Jenkins 下载地址:War Jenkins Packages 运行Jenkins之前确保系统已经安装好JDK,因为我安装的是JDK1.8,所以选择2.346.1 这个版本 2.启动jenkins 将下载好的jenkins.war上传到服务器上,我的目录是/home/jenkins 启动命令 java -jar jenkins.war --httpPo…

万字详文:TCP 拥塞控制详解

本文主要介绍 TCP 拥塞控制算法,内容多来自网上各个大佬的博客及《TCP/IP 详解》一书,在此基础上进行梳理总结,与大家分享。因水平有限,内容多有不足之处, 敬请谅解。一、TCP 首部格式 在了解 TCP 的拥塞控制之前&…

多向思考者--高敏感人群的内心世界

工作以后很少看心理学的书,因为心理学书给我的印象是:国外翻译的很啰嗦,国内的太鸡汤,看的时候能有感触,看完以后就都忘记了。阅读心理学的书籍,更多的是跟着书中的内容和自己对话。看完《多向思考者》这本…

SpringMVC使用(二)

1. 统一异常处理 SpringMVC提供了统一处理Controller层抛出的异常的方法 1.1 统一异常处理案例 RestController的统一异常处理 package com.lan.controller;import com.lan.exception.BusinessException; import com.lan.exception.SystemException; import org.springfram…

DolphinDB Kafka 插件介绍

1. DolphinDB Kafka 插件介绍 DolphinDB Kafka 插件支持把 DolphinDB 中生产的数据推送到 Kafka,也支持从 Kafka 订阅数据,并在 DolphinDB 中消费。用户可以在 DolphinDB 中实例化 Producer 对象,把 DolphinDB 中的数据同步到 Kafka 中指定的…

LeetCode | 218. 天际线问题

城市的天际线是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓。给你所有建筑物的位置和高度,请返回由这些建筑物形成的天际线 。 每个建筑物的几何信息由数组 buildings 表示,其中三元组 buildings[i] [lefti, righti, heighti] 表示:…

Egg如何实现文件上传

文件上传是开发中不可避免的一项。那么在没有单独的资源服务器的时候&#xff0c;上传的文件可能要放在我们的项目文件夹服务器上&#xff0c;我们如何实现文件上传呢&#xff1f; 首先不用想&#xff0c;我们需要一个测试页面。html用来上传文件。如下&#xff1a; <!DOCT…

D. Minimal Height Tree(如何BFS遍历序列使树的高度最小)

Problem - 1437D - Codeforces Monocarp有一棵由n个顶点组成的树&#xff0c;它的根在顶点1。他决定研究BFS&#xff08;宽度优先搜索&#xff09;&#xff0c;所以他在他的树上运行BFS&#xff0c;从根开始。BFS可以用下面的伪代码来描述。 a [] # 顶点被处理的顺序 q Queu…

mdr1基因寡核苷酸/酸敏感靶多肽/聚乙二醇埃博霉素B偶联阿霉素的相关制备

小编这里整理了mdr1基因寡核苷酸/酸敏感靶多肽/聚乙二醇埃博霉素B偶联阿霉素的相关内容&#xff0c;一起来看&#xff01; 聚乙二醇埃博霉素B偶联阿霉素相关研究&#xff1a; 阿霉素与酰肼聚乙二醇羧基在磷酸的作用下反应制得阿霉素聚乙二醇羧基中间体,其中阿霉素与磷酸的摩尔比…

Android App手势冲突处理中上下左右滑动的处理以及侧滑边缘菜单的讲解及实战(附源码 可直接使用)

运行有问题或需要源码请 点赞关注收藏后评论区留言~~~ 一、上下滚动与左右滑动的冲突处理 Android控件繁多&#xff0c;允许滚动或滑动操作的视图也不少&#xff0c;如果开发者要自己接管手势处理&#xff0c;那么这个页面的滑动就存在冲突的情况&#xff0c;如果系统响应了A视…

贴花、射线、动画通知——足迹01

案例实现效果&#xff1a; 人物跑步留下脚印&#xff08;其他运动留下脚印也是同理&#xff09;。 重点&#xff1a; 贴花的创建、射线、动画通知。射线碰撞决定贴花生成位置&#xff0c;动画通知决定贴花生成时间。 一、贴花 1、贴花纹理图 在网络上找素材&#xff08…

JavaSE之动态代理

目录动态代理动态代理的好处Proxy重写invoke方法实例最后动态代理 动态代理需要确定要代理的对象&#xff0c;所以需要先new一个要代理的对象 动态代理的好处 可以在不改变方法源码的情况下&#xff0c;实现对方法功能的增强。 简化了代码。 提高了软件系统的可扩展性。 P…

【TensorRT】神经网络中的量化

文章目录一、TensorRT 为什么需要量化二、基础内容三、神经网络的量化过程一、TensorRT 为什么需要量化 量化是什么&#xff1a;量化在数字信号处理领域&#xff0c;是指将信号的连续取值&#xff08;或者大量可能的离散取值&#xff09;近似为有限多个&#xff08;或较少的&a…