Go中的异常处理

news2025/1/19 3:00:03

Go 中异常处理

主要掌握 一下几个方面:

  1. 掌握error接口
  2. 掌握defer延迟
  3. 掌握panic及recover

error接口

error是指程序中出现不正常的情况,从而导致程序无法正常运行;

go中为错误的类型提供了简单的错误处理机制

go中error的源码:

// The error built-in interface type is the conventional interface for
// representing an error condition, with the nil value representing no error.
type error interface {
	Error() string
}

可以看到接口中定义了Error方法,我们可以实现这个方法已实现error接口;

error本质上是一个接口类型,其中包含一个Error()方法,错误值可以存储在变量中,通过函数返回。它必须是函数返回的最后一个值。

在go中处理错误的方式通常是以下的形式:

if err!=nil{
fmt.println(err)
}

代码Demo


func Divide(a,b float64)(float64,error){
	if b==0{
		return -1 ,errors.New("by zero")
	}else {
		return a/b, nil
	}

}
func main() {
	divide, err := Divide(10, 0)
	if err!=nil{
		fmt.Println(err)
	}else {
		fmt.Println(divide)
	}
}

在这里插入图片描述

创建error对象

由于error是一个接口,因此只要实现该接口中的方法就可以:

结构体只要实现了Error() string这种格式的方法,就代表实现了该错误接口,返回值为错误的具体描述

在这之前我们先看一下go中提供了哪些关于error的方法:
在这里插入图片描述

简单看一下Join()的源码:

func Join(errs ...error) error {
	n := 0
	for _, err := range errs {
		if err != nil { //如果传进来的err不是 nil
			n++//n自增
		}
	}
	if n == 0 {
		return nil
	}
	e := &joinError{
		errs: make([]error, 0, n),
	}
	for _, err := range errs {
		if err != nil {
			e.errs = append(e.errs, err)
		}
	}
	return e
}

简单来讲就是err的拼接

func main() {
 	r, err := errorR(121)
	if err!=nil {
		fmt.Println(err)
		fmt.Printf("err的类型%T\n",err)
	}else {
		fmt.Println(r)
	}
}

func errorR(age int) (string, error) {

	if age < 0 || age > 120 {
		err := fmt.Errorf("输入的年龄%d不符合统计要求", age)
		return "", err
	} else {
		str := "您输入的年龄" + strconv.FormatInt(int64(age), 10) + "符合要求"
		return str, nil
	}
}

自定义错误

自定义错误的实现步骤如下。

  • • 定义一个结构体,表示自定义错误的类型。
  • • 让自定义错误类型实现error接口:Error()string。
  • • 定义一个返回error的函数。根据程序实际功能而定。

代码demo


//定义结构体

type errorDefine struct {
	reason string
}
//实现Error()方法
func (e errorDefine)Error()string  {

	return "除数为0,不符合要求/"+e.reason
}

func Divide2(a,b int)(float64,error){
	defineerr := errorDefine{reason: "by Zero"}

	if b==0{
		return -1,defineerr
	}else{
		return float64(a / b),nil
	}
}
func main() {
	divide2, err := Divide2(100, 0)
	if err!=nil {
		fmt.Println(err)
	}else {
		fmt.Println(divide2)
	}
}

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

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

相关文章

栈:程序员必备的工具箱

栈的结构和基本操作 本篇博客会讲解栈。栈是一种线性的数据结构&#xff0c;它满足“后进先出”的特性。栈有两端&#xff0c;分别是栈顶和栈底。每次插入或者删除数据&#xff0c;都是在栈顶的方向进行的。画个图解释一下&#xff1a;假设上面是栈顶&#xff0c;下面是栈底。…

linux ioctl 理解

背景 传统的操作系统可以分成两层&#xff0c;用户层和内核层。内核代码处理敏感资源同时在不同应用程序中间提供了安全且可信的隔离&#xff0c;出于此&#xff0c;操作系统要阻止用户态的程序直接访问内核资源。用户空间的程序通常发出一个给内核的请求&#xff0c;该请求称为…

基于vite4+pinia2模仿chatgpt移动端聊天模板Vue3MobileGPT

运用vite4.x构建mobile端仿chatgpt聊天实例Vue3-mobileGPT vue3-mobilegpt 基于 vite4vue3pinia2vue-routervant 等技术开发移动端仿ChatGPT智能聊天项目模板。支持lightdark两种主题&#xff0c;搭配vue3组件库Vant&#xff0c;界面简洁美观。 就前几天OpenAI就推出了IOS版Cha…

从 Vue Devtools 调用 WebStorm 打开文件

从 Vue Devtools 调用 WebStorm 打开文件 Vue Devtools 有一个功能, 可以直接在查看组件时, 直接打开对应的文件, 但默认是使用 VSCode 打开, 本文介绍如何使用 WebStorm 打开文件. 修改 vue.config.js: const openInEditor require("launch-editor-middleware");…

外包工作6年,聊一下感想.....

我不知道当年怎么想的&#xff0c;能在一个外包公司一干就是6年&#xff0c;后来终于跳出来了&#xff0c;现在的公司虽然不是什么大厂吧&#xff0c;但至少是个正经的互联网企业&#xff0c;待遇也不错。其实很多地方的朋友都有提到外包公司的一些弊端。 我个人的建议是&#…

linux下安装google谷歌浏览器

前言 记录下linux下安装谷歌浏览器全过程。 一、下载安装包 https://www.google.cn/intl/zh-CN/chrome/ 访问谷歌浏览器&#xff0c;拉到最下面 点击其他平台&#xff0c;选择linux 然后下载下来 下载完成后得到一个安装包 二、安装步骤 2.1.上传到linux服务器&#x…

chatgpt赋能Python-python_calu

Python Calu&#xff1a;Python程序员不可或缺的计算工具 作为一名有10年Python编程经验的工程师&#xff0c;我一直在使用Python编写各种程序&#xff0c;其中不可或缺的就是Python Calu。在下面&#xff0c;我将向您介绍Python Calu的特点及其在Python编程中的重要性。 什么…

uniapp内使用 mescroll

前言 在使用uniapp开发项目的过程中&#xff0c;在很多场景里都需要下拉刷新和上拉加载&#xff0c;而 mescroll.js 则是一个非常精致的下拉刷新和上拉加载 js 框架。 官网地址&#xff1a;mescroll 介绍 mescroll.js 是在 H5端 运行的下拉刷新和上拉加载插件&#xff0c;时…

如何使用 Xshell 连接 Linux 服务器

目录 &#x1f333;搭建 Linux 环境 &#x1f331;Linux 环境的搭建方式 ☘️购买云服务器 &#x1f333;使用Xshell远程登陆到Linux服务器 &#x1f331;下载安装Xshell ☘️查看Linux主机ip &#x1f340;使用Xshell登录主机 &#x1f4a7;方法1 &#x1f4a7;方法2…

宝塔面板搭建网站教程:Linux下使用宝塔一键搭建网站,内网穿透发布公网上线

文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 转载自cpolar内网穿透的文章&#xff1a;使用宝塔面板快速搭建网站&#xff0c;并内网穿透实现公网远程访问 前言 宝塔面板作为简单好用的服务器运维管理面板&…

VScode必备插件大全

为了高效率的工作&#xff0c;我们在使用vScode的是时候&#xff0c;经常会用到一些好用的插件&#xff1b;现在就个人喜欢的插件分享给大家&#xff0c;欢迎点赞加收藏&#xff1b; 1、JavaScript(ES6) code snippets ES6 语法智能提示及快速输入&#xff0c;不仅仅支持 .js…

2009.03-2022.06华证ESG季度评级(季度)

2009.03-2022.06华证ESG评级&#xff08;季度&#xff09; 1、时间&#xff1a;2009.03-2022.06.15 2、来源&#xff1a;整理自Wind 3、指标&#xff1a;华证ESG&#xff08;只有综合评级&#xff0c;无细分评级数据&#xff09; 4、样本数量&#xff1a;A股4800多家公司 …

由浅入深Dubbo核心源码剖析高阶配置运用

目录 1 不同配置覆盖关系2 属性配置优先级3 重试与容错处理机制4 多版本控制5 本地存根调用6 负载均衡机制7 服务降级运用8 并发与连接控制 1 不同配置覆盖关系 Dubbo高阶配置运用 关于配置参看官方文档&#xff1a;https://dubbo.apache.org/zh/docsv2.7/user/configuration/ …

chatgpt赋能Python-python_bobo

Python Bobo&#xff1a;轻量级Web框架 Python是一个强大的编程语言&#xff0c;被广泛用于web应用程序和数据科学。用Python构建web应用程序的其中一条途径是使用框架。它们提供了一些实用的功能&#xff0c;如路由、模板、数据库集成等等。 Python中许多框架都很强大&#x…

Keil Debug 串口调试技巧

Keil Debug 串口调试技巧 效果 debug窗口效果 虚拟串口效果 debug窗口实现方法 第一步&#xff1a;配置参数 更改对应的bebug窗口参数 两边的 Dialog DLL 更改为&#xff1a;DARMSTM.DLL两边的 Parameter &#xff08;这里的根据单片机型号更改&#xff09;更改为&#xff…

chatgpt赋能Python-python_char

Python Char&#xff1a;了解 Python 字符的基础知识 Python是一种广泛使用的编程语言&#xff0c;因其易于学习、语法简单且适用于不同的应用场景而备受欢迎。在Python中&#xff0c;字符是一种重要的数据类型&#xff0c;也是值得深入学习的主题之一。本文将介绍Python字符的…

基于 Docker 搭建 ownCloud 个人云盘

本文源码&#xff1a;https://github.com/chen2438/chenhaotian.top/tree/main/source/_posts/linux-app/owncloud.md 在我的博客上查看&#xff1a;https://chenhaotian.top/2022/09/07/linux-app/owncloud/ 基于 Docker 搭建 ownCloud 个人云盘 官方文档 机翻气息贯穿全文…

【JUC基础】09. LockSupport

1、什么是LockSupport LockSupport是一个线程阻塞工具&#xff0c;可以在线程任意位置让线程阻塞。线程操作阻塞的方式其实还有Thread.suspend()和Object.wait()。而LockSupport与suspend()相比&#xff0c;弥补了由于resume()方法而导致线程被挂起&#xff08;类似死锁&#x…

chatgpt赋能Python-python_bin目录

了解Python中的Bin目录 如果你是Python编程的初学者&#xff0c;可能会对Python中的Bin目录感到困惑。本文将为你介绍Bin目录的作用&#xff0c;以及为什么它对于Python编程人员来说是如此重要。 什么是Bin目录&#xff1f; Bin目录是Python安装时创建的一个目录&#xff0c…