当前位置: 首页 > news >正文

15分钟学 Go 第 20 天:Go的错误处理

第20天:Go的错误处理

目标

学习如何处理错误,以确保Go程序的健壮性和可维护性。

1. 错误处理的重要性

在开发中,错误处理至关重要。程序在运行时可能会出现各种问题,例如文件未找到、网络连接失败等。正确的错误处理能帮助我们及时发现问题,提供优雅的错误处理机制,确保软件的可靠性和用户体验。

2. Go语言中的错误类型

在Go语言中,错误处理主要依赖于error类型。error是一个内置接口,其定义如下:

type error interface {Error() string
}

任何实现了Error方法的类型都可以被视为错误,例如标准库中的osio包中的错误类型。

错误处理的基本步骤

  1. 检查错误:在调用可能返回错误的函数后,要立即检查返回的错误。
  2. 处理错误:根据业务需求,决定如何处理错误。
  3. 返回错误:在函数中,适当地返回错误给调用方。

错误处理的规范

Go语言提倡便捷而显式的错误处理方式。例如,在调用函数时立即处理错误,而不是使用异常机制。

3. 错误处理的示例

下面是一个简单的文件读取示例,演示如何处理错误。

示例代码

package mainimport ("fmt""io/ioutil""log"
)func readFromFile(filePath string) (string, error) {data, err := ioutil.ReadFile(filePath)if err != nil {return "", err // 返回错误}return string(data), nil
}func main() {filePath := "example.txt"content, err := readFromFile(filePath)if err != nil {log.Fatalf("Error reading file: %v", err) // 处理错误并退出程序}fmt.Println("File content:", content)
}

运行流程图

以下是示例代码的运行流程图:

+----------------------------+
|       main()函数          |
+----------------------------+|v+---------------------+|  调用readFromFile() |+---------------------+|v+-------------------------+|  调用ioutil.ReadFile()  |+-------------------------+|v+-------------------+|      返回错误      |+-------------------+|v+-------------------+|  判断错误是否为 nil |+-------------------+|v(是) -> +--------------+   |  打印内容  |    (否) ---> +--------------+|   处理错误  |+--------------+

代码运行流程详解

  1. main函数中定义了文件路径filePath
  2. 调用readFromFile函数读取文件。
  3. readFromFile中,使用ioutil.ReadFile尝试读取文件内容。
  4. 如果读取失败,则返回错误。
  5. main中检查错误。如果存在错误,则使用log.Fatalf打印错误并退出程序。
  6. 如果没有错误,输出文件内容。

4. 自定义错误类型

除了使用内置的error接口外,有时我们需要定义自定义错误,以便提供更具体的错误信息。

自定义错误的示例

package mainimport ("fmt"
)// Custom error type
type FileError struct {Filename stringErr      error
}// 实现Error方法
func (e *FileError) Error() string {return fmt.Sprintf("Error reading file %s: %v", e.Filename, e.Err)
}func readFromFile(filePath string) (string, error) {data, err := ioutil.ReadFile(filePath)if err != nil {return "", &FileError{Filename: filePath, Err: err} // 包装错误}return string(data), nil
}func main() {filePath := "example.txt"content, err := readFromFile(filePath)if err != nil {fmt.Println(err) // 打印自定义错误return}fmt.Println("File content:", content)
}

关键点

  1. 通过定义结构体FileError和实现Error方法,实现了自定义错误类型。
  2. 将错误包装在FileError中,使得错误信息更具可读性。

5. 包装和解包错误

Go 1.13引入了errors包中的IsAs函数,这使得错误处理更加灵活和强大。

错误包装的示例

使用fmt.Errorferrors.Unwrap

package mainimport ("errors""fmt"
)func main() {err := errors.New("original error")wrappedErr := fmt.Errorf("wrapped error: %w", err) // 使用%w进行错误包装// 解包错误if errors.Is(wrappedErr, err) {fmt.Println("The wrapped error contains the original error")}
}

错误解包的优点

  1. 便于判断错误类型。
  2. 可以在不同的层级中恢复到原始错误,使错误跟踪更加清晰。

6. 错误处理的最佳实践

  • 尽早检测错误:在可能发生错误的地方提前检查并处理,而不是延迟处理。
  • 记录错误日志:使用适当的日志机制记录错误信息,以便日后分析和修复。
  • 提供用户友好的错误信息:将错误信息格式化,使其对最终用户友好。
  • 保持简洁明了:避免过度复杂的错误处理逻辑。

7. 最后总结

在Go语言中,错误处理是一个核心概念,通过error接口、中自定义错误和错误包装等机制,Go为我们提供了一种简洁高效的方式来处理错误。掌握这些技巧对于编写健壮的Go程序至关重要。

学习小结

  • 理解Go语言的错误处理机制及其重要性。
  • 学会使用内置的错误类型和自定义错误类型。
  • 熟悉错误的包装和解包方法。
  • 掌握最佳实践,为编写高质量Go代码打下基础。

练习

  1. 创建一个自己的错误类型,模拟文件不存在时的错误处理。
  2. 尝试使用errors.Iserrors.As进行错误解包和判断。
  3. 设计一个小程序,读取用户输入内容,并在读取失败时提供友好的错误信息。

怎么样今天的内容还满意吗?再次感谢观众老爷的观看,关注GZH:凡人的AI工具箱,回复666,送您价值199的AI大礼包。最后,祝您早日实现财务自由,还请给个赞,谢谢!

相关文章:

15分钟学 Go 第 20 天:Go的错误处理

第20天:Go的错误处理 目标 学习如何处理错误,以确保Go程序的健壮性和可维护性。 1. 错误处理的重要性 在开发中,错误处理至关重要。程序在运行时可能会出现各种问题,例如文件未找到、网络连接失败等。正确的错误处理能帮助我们…...

C++——string的模拟实现(上)

目录 引言 成员变量 1.基本框架 成员函数 1.构造函数和析构函数 2.拷贝构造函数 3.容量操作函数 3.1 有效长度和容量大小 3.2 容量操作 3.3 访问操作 (1)operator[]函数 (2)iterator迭代器 3.4 修改操作 (1)push_back()和append() (2)operator函数 引言 在 C—…...

JavaCV 之均值滤波:图像降噪与模糊的权衡之道

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...

桥接模式,外界与主机通,与虚拟机不通

一 二 在此选择Windows与外界连接的网卡,通过有线连就选有线网卡,通过无线连就选无线网卡。 三 如果需要设置固定IP,则选择"Manual"进行设置。我这边根据实际需要,走无线的时候用DHCP,走有线的时候设固定IP…...

用HTML构建酷炫的文件上传下载界面

1. 基础HTML结构 首先&#xff0c;我们构建一个基本的HTML结构&#xff0c;包括一个表单用于文件上传&#xff0c;以及一个列表用于展示已上传文件&#xff1a; HTML <!DOCTYPE html> <html> <head><title>酷炫文件上传下载</title><link …...

Gateway 统一网关

一、初识 Gateway 1. 为什么需要网关 我们所有的服务可以让任何请求访问&#xff0c;但有些业务不是对外公开的&#xff0c;这就需要用网关来统一替我们筛选请求&#xff0c;它就像是房间的一道门&#xff0c;想进入房间就必须经过门。而请求想要访问微服务&#xff0c;就必须…...

7 种常见的前端攻击

大家都知道&#xff0c;保证网站的安全是十分重要的&#xff0c;一旦网站被攻陷&#xff0c;就有可能造成用户的经济损失&#xff0c;隐私泄露&#xff0c;网站功能被破坏&#xff0c;或者是传播恶意病毒等重大危害。所以下面我们就来讲讲7 种常见的前端攻击。 1. 跨站脚本 (X…...

element plus实现点击上传于链接上传并且回显到upload组件中

摘要&#xff1a; 今天遇到一个问题&#xff1a;vue3使用elemnt plus的上传图片时&#xff0c;数据是从别人的系统导出来的商品&#xff0c;图片是http的形式的&#xff0c;并且商品很多的&#xff0c;一个一个下载下来再上传很麻烦的&#xff0c;所以本系统插件商品时图片使用…...

ELK日志分析系统部署

ELK日志分析系统 ELK指的是ElasticsearchLogstashKibana这种架构的缩写。 ELK是一种日志分析平台&#xff0c;在很早之前我们经常使用Shell三剑客&#xff08;一般泛指grep、sed、awk&#xff09;来进行日志分析&#xff0c;这种方式虽然也可以应对多种场景&#xff0c;但是当…...

驾校小程序:一站式学车解决方案的设计与实践

​​一、引言 随着移动互联网技术的飞速发展&#xff0c;人们的生活方式和消费习惯正在发生深刻变化。驾校作为传统的服务行业&#xff0c;也面临着数字化转型的迫切需求。驾校小程序作为一种轻量级的应用&#xff0c;能够为用户提供便捷、丰富的学车服务&#xff0c;成…...

【自然语言处理】BERT模型

BERT&#xff1a;Bidirectional Encoder Representations from Transformers BERT 是 Google 于 2018 年提出的 自然语言处理&#xff08;NLP&#xff09;模型&#xff0c;它基于 Transformer 架构的 Encoder 部分。BERT 的出现极大提升了 NLP 任务的性能&#xff0c;如问答系…...

Android 添加如下飞行模式(飞行模式开和关、飞行模式开关菜单显示隐藏)接口

请添加如下飞行模式(飞行模式开关、飞行模式开关显示隐藏)接口: 飞行模式飞行模式开关com.action.airplankey: enable value:boolean true open the airplan false close the airplan关闭Intent intent = new Intent(); intent.setAction("com.action.airplan");…...

【Vue3】基于 Vue3 + ECharts 实现北京市区域地图可视化

文章目录 基于 Vue3 ECharts 实现北京市区域地图可视化1、引言2、项目初始化2.1、环境搭建2.2 、安装依赖2.3、项目结构 3、地图数据准备3.1、地图 JSON 文件获取&#xff08;具体的json数据&#xff09; 4、 组件开发4.1、Map 组件的设计思路4.2、基础结构实现4.3、核心数据结…...

【IC】什么是min period check

在 Synopsys Primetime 工具中可以检查.lib 文件中时钟输入的最小周期。想象这样一个场景&#xff0c;有一个设计 A&#xff0c;它有一个名为 clk 的时钟&#xff0c;并且该设计的 clk 周期被设定为一个值&#xff0c;比如 2 纳秒&#xff0c;即 500MHz。假设我们在进行静态时序…...

MyBatis入门之一对多关联关系(示例)

【图书介绍】《SpringSpring MVCMyBatis从零开始学&#xff08;视频教学版&#xff09;&#xff08;第3版&#xff09;》-CSDN博客 《SpringSpring MVCMyBatis从零开始学(视频教学版)&#xff08;第3版&#xff09;》(杨章伟&#xff0c;刘祥淼)【摘要 书评 试读】- 京东图书 …...

【Git 】Windows 系统下 Git 文件名大小写不敏感

背景 在 Windows 系统上&#xff0c;Git 对文件名大小写的不敏感性问题确实存在。由于 Windows 文件系统&#xff08;如 NTFS &#xff09;在默认情况下不区分文件名大小写所导致的。 原因分析 文件系统差异 Windows文件系统&#xff08;如 NTFS&#xff09;默认不区分文件名…...

【算法系列-二叉树】层序遍历

【算法系列-二叉树】层序遍历 文章目录 【算法系列-二叉树】层序遍历1. 算法分析&#x1f6f8;2. 相似题型&#x1f3af;2.1 二叉树的层序遍历II(LeetCode 107)2.2 二叉树的右视图(LeetCode 199)2.3 二叉树的层平均值(LeetCode 637)2.4 N叉树的层序遍历(LeetCode 429)2.5 在每个…...

我的世界方块改进版

引子 之前文章的磁性方块&#xff0c;通过3D打印实现&#xff0c;也批量打印了一些&#xff0c;下图就是一个小树 使用过程中&#xff0c;发现磁力感觉不紧&#xff0c;所以想改进一版。 正文 之前的结构如下&#xff1a;&#xff1a; 如果出现相邻的空隙间的磁铁相互作用&am…...

博客搭建之路:hexo增加搜索功能

文章目录 hexo增加搜索功能本地搜索弊端algolia搜索 hexo增加搜索功能 hexo版本5.0.2 npm版本6.14.7 next版本7.8.0 作为一个博客&#xff0c;没有搜索功能&#xff0c;如何在大批文章中找到自己想要的&#xff0c;那在hexo中如何增加搜索功能呢&#xff1f; search:path: sea…...

2024年最新互联网大厂精选 Java 面试真题集锦(JVM、多线程、MQ、MyBatis、MySQL、Redis、微服务、分布式、ES、设计模式)

前言 春招&#xff0c;秋招&#xff0c;社招&#xff0c;我们 Java 程序员的面试之路&#xff0c;是挺难的&#xff0c;过了 HR&#xff0c;还得被技术面&#xff0c;在去各个厂面试的时候&#xff0c;经常是通宵睡不着觉&#xff0c;头发都脱了一大把&#xff0c;还好最终侥幸…...

MybatisPlus入门(一)MybatisPlus简介

一、MyBatis简介 MyBatisPlus&#xff08;简称MP&#xff09;是基于MyBatis框架基础上开发的增强型工具&#xff0c;旨在简化开发、提高效率 - 官网&#xff1a;https://mybatis.plus/ https://mp.baomidou.com/ MyBatisPlus特性&#xff1a; - 无侵入&#xff1a;只做增强…...

QoS学习笔记

QoS业务分类 基于 DiffServ 服务模型的 QoS 业务可以分为以下几大类&#xff1a; 流分类和标记&#xff08;Traffic classification and marking&#xff09;&#xff1a;要实现差分服务&#xff0c;需要首先将数据包分为不同的类别或者设置为不同的优先级。将数据包分为不同…...

图(邻接矩阵)知识大杂烩!!(邻接矩阵结构,深搜,广搜,prim算法,kruskal算法,Dijkstra算法,拓扑排序)(学会一文让你彻底搞懂!!)

小伙伴们大家好&#xff0c;今天给大家带来图&#xff08;邻接矩阵&#xff09;的各种知识&#xff0c;让你看完此文章彻底学会邻接矩阵的相关问题。 1.邻接矩阵表示方法 1.1知识讲解 我们用一个二维数组arr来表示图。若图为有向图&#xff0c;其中arr【i】【j】w表示i号点和…...

Prometheus自定义PostgreSQL监控指标

本文我们将介绍如何在Prometheus中创建自定义PostgreSQL指标。默认情况下由postgres_export运行的查询可能不能满足用户需求&#xff0c;但我们可以创建自定义查询&#xff0c;并要求postgres_exporter公开自定义查询的结果。postgres_exporter最近被移到了Prometheus Communit…...

400行程序写一个实时操作系统(十六):操作系统中的调度策略

前言 在前面我们完成了Sparrow的临界区的代码&#xff0c;使用临界区&#xff0c;能够解决常见的并发问题&#xff0c;现在该完善我们的调度算法了。 调度算法在操作系统领域常常是热门的话题。不同的用途将会使用不同的调度策略。在本节&#xff0c;笔者将为大家介绍一些操作…...

从安灯系统看汽车零部件工厂的智能制造转型

在当今快速发展的制造业领域&#xff0c;汽车零部件工厂正面临着日益激烈的市场竞争和不断提高的客户需求。为了在竞争中脱颖而出&#xff0c;实现可持续发展&#xff0c;许多汽车零部件工厂纷纷踏上智能制造转型之路。而安灯系统作为一种重要的生产管理工具&#xff0c;在这场…...

SwiftUI(三)- 渐变、实心形状和视图背景

引言 在现代的应用的UI设计中&#xff0c;渐变和形状背景为界面带来了丰富的层次与视觉效果&#xff0c;而SwiftUI提供了一系列简单且强大的API&#xff0c;可以轻松实现这些效果。在这篇文章中&#xff0c;我们将介绍SwiftUI中的渐变、实心形状和视图背景的基础用法&#xff…...

RK3568-ota升级

ota升级 OTA&#xff08;Over-the-Air&#xff09;即空间下载技术。 OTA 升级是 Android 系统提供的标准软件升级方式。它功能强大&#xff0c;可以无损失升级系统&#xff0c;主要通过网络&#xff0c;例如 WIFI、3G/4G 自动下载 OTA 升级包、自动升级&#xff0c;也支持通过…...

GR-ConvNet代码详解

GR-ConvNet代码详解 文章目录 GR-ConvNet代码详解前言一、utils1.dataset_processing1.image.py1.Iamge类2.DepthImage类3.WidthImage类 2.grasp.py1. _gr_text_to_no()方法2.GraspRectangles类3.GraspRectangle类3.Grasp类4.detect_grasps方法 3.generate_cornell_depth.py4.e…...

Excel自带傅里叶分析数据处理——归一化处理

在Excel工具中&#xff0c;默认情况下数据处理---傅里叶分析通常不进行归一化处理&#xff0c;需要用户手动进行归一化处理。 &#xff08;1&#xff09;傅里叶变换的原理 傅里叶变换将时域信号转换为频域信号&#xff0c;输出的是复数形式的频率分量&#xff0c;包含了幅值和…...

好买卖做网站/合肥网络公司

今天做到一个笔试题&#xff1a; 快速找出一个数组中最大数和第二大的数。 既然这是一道笔试题&#xff0c;肯定要多一点思路。 我一开始拿到这个题目是这么想的&#xff1a;用冒泡或者选择法将一个数组进行从小到大排序&#xff0c;然后输出最后两个数。 显然这并不是最佳的…...

网站栏目做树形结构图/重庆seowhy整站优化

Docker的C/S模式&#xff1a; 用户通过Docker的CLI客户端向Docker守护进程发送指令&#xff0c;然后Docker守护进程将执行结果通过Docker的CLI客户端显示给用户。 Docker也提供了与守护进程通信的API&#xff0c;叫做RemoteAPI。RemoteAPI在复杂的情况下支持使用STDIN/STDOUT/S…...

自建网站营销是什么意思/网络营销的目标

我有简单的Django项目名称阿贾克斯。而我安装了这个项目的名称促销码只有一个应用程序。 我在这个项目中的问题是js和python之间的Ajax调用。我不能使用ajax调用函数处理Succes。错误&#xff1a;函数()结果我得到了。 我知道我在Ajax调用函数促销码的应用程序和URL映射urls.py…...

做资源下载网站好吗/中牟网络推广外包

1. 模式意图 使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接受者之间的耦合关系。 在职责链模式里&#xff0c;很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递&#xff0c;知道链上的某一个对象决定处理此请求。发出这个请求…...

wordpress官网中文版下载/专业网页设计和网站制作公司

微服务的概念源于2014年3月Martin Fowler(马丁福勒)所写的一篇文章“Mieroservices”(微服务)。文中表达了一种观念&#xff0c;微服务架构是一种架构模式&#xff0c;它提倡将单一应用程序划分成一组小的服务&#xff0c;服务之间互相协调、互相配合&#xff0c;为用户提供最终…...

单页面网站带后台/龙岩网站推广

Java基础&#xff08;对象线程字符接口变量异常方法&#xff09; 面向对象和面向过程的区别&#xff1f;Java 语言有哪些特点&#xff1f;关于 JVM JDK 和 JRE 最详细通俗的解答Oracle JDK 和 OpenJDK 的对比Java 和 C的区别&#xff1f;什么是 Java 程序的主类&#xff1f;应…...