非零基础自学Golang 第10章 错误处理 10.1 错误处理的方式 10.2 自定义错误

news2024/9/23 19:20:17

非零基础自学Golang

文章目录

      • 非零基础自学Golang
      • 第10章 错误处理
        • 10.1 错误处理的方式
        • 10.2 自定义错误
          • 10.2.1 错误类型
          • 10.2.2 创建错误
          • 10.2.3 自定义错误格式

第10章 错误处理

我们在编写程序时,为了加强程序的健壮性,往往会考虑到对程序中可能出现的错误和异常进行处理。

Go语言设计者认为类似try-catch-finally的传统异常处理机制很容易造成开发者对异常机制的滥用,从而使代码结构变得混乱。

因此,在Go语言中会使用多值返回来返回错误。这种检查错误的方式给程序员提供了很大的控制权。

10.1 错误处理的方式

我们首先来观察下ioutil包中的ReadFile方法,代码如下:

在这里插入图片描述

当然现在 已经弃用了

在这里插入图片描述

但是笔者还是找到了 源代码:https://cs.opensource.google/go/go/+/refs/tags/go1.6.4:src/io/ioutil/ioutil.go

func ReadFile(filename string) ([]byte, error) {
	f, err := os.Open(filename)
	if err != nil {
		return nil, err
	}
	defer f.Close()
	// It's a good but not certain bet that FileInfo will tell us exactly how much to
	// read, so let's try it but be prepared for the answer to be wrong.
	var n int64

	if fi, err := f.Stat(); err == nil {
		// Don't preallocate a huge buffer, just in case.
		if size := fi.Size(); size < 1e9 {
			n = size
		}
	}
	// As initial capacity for readAll, use n + a little extra in case Size is zero,
	// and to avoid another allocation after Read has filled the buffer.  The readAll
	// call will read into its allocated internal buffer cheaply.  If the size was
	// wrong, we'll either waste some space off the end or reallocate as needed, but
	// in the overwhelmingly common case we'll get it just right.
	return readAll(f, n+bytes.MinRead)
}

我们通常使用该函数来打开指定路径下的文件。

ReadFile方法包含两个返回值,类型分别为[]byte和error。我们通过error类型的返回值来判断方法调用是否产生错误,若值为nil,则调用未产生错误

打开文件的代码如下:

[ 动手写 10.1.1]

package main

import (
   "fmt"
   "io/ioutil"
)

func main() {

   f, err := ioutil.ReadFile("test.txt")
   if err != nil {
      fmt.Println(err)
   } else {
      fmt.Println(f)
   }
}

运行结果:

在这里插入图片描述

由于源代码所在文件夹下没有test.txt文件,系统未找到指定的文件,因此使用ReadFile函数读取文件失败。

这也是Go语言编程中最常见的错误处理方式之一。

10.2 自定义错误

10.2.1 错误类型

Go语言的error类型实际上是一个接口,定义如下:

type error interface {
 	Error() string
}

error接口包含Error方法,用来返回一个字符串。换言之,所有符合Error()string格式的方法,都能实现错误接口。【果然,天下 语言一家亲】

10.2.2 创建错误

Go语言标准库中的errors包可以用来创建错误,自定义错误内容,格式如下:

err := errors.New("this is an error")

我们使用errors包的New函数来创建自定义错误,代码如下:

[ 动手写 10.2.1]

package main

import (
   "errors"
   "fmt"
)

func main() {

   err := errors.New("this is an error.")

   var err2 error
   fmt.Println(err.Error())
   fmt.Println(err2)
}

运行结果

在这里插入图片描述

从执行结果可知:error的类型变量在声明后其默认值为nil。

10.2.3 自定义错误格式

标准库中的fmt包提供了Errorf方法,用来设置返回错误内容的格式,其源码如下:

func Errorf(format string, a ...interface{}) error {
 	return errors.New(Sprintf(format, a...))
}

我们可以发现Errorf方法本质上还是调用了errors包的New方法来创建了一个错误,并使用Sprintf方法来对错误进行格式化。

[ 动手写 10.2.2 ]

package main

import (
	"fmt"
	"runtime"
)

func main() {

	if _, _, line, ok := runtime.Caller(0); ok == true { // 错误所在位置

		err := fmt.Errorf("***Line %d error***", line)
		fmt.Println(err.Error())
	}
}

运行结果

在这里插入图片描述

在程序中,我们通过调用runtime包的Caller方法获取当前代码所在行数,用来模拟错误的产生。

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

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

相关文章

大数据必学Java基础(一百一十三):监听器概念引入

文章目录 监听器概念引入 一、什么是监听器? 二、监听器怎么分类?

SQL - MySQL深分页

一、MySQL深分页问题 我们在日常开发中&#xff0c;查询数据量比较大的时候&#xff0c;后端基本都会通过前端&#xff0c;移动端传过来的页码&#xff0c;每页数据行数&#xff0c;通过SQL中的 limit 进行分页&#xff0c;如果查询页数比较小的时候&#xff0c;不会出现太大问…

【有营养的算法笔记】 二分+排序/堆 求解矩阵中战斗力最弱的 K 行

&#x1f451;作者主页&#xff1a;进击的安度因 &#x1f3e0;学习社区&#xff1a;进击的安度因&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;有营养的算法笔记 ✉️分类专栏&#xff1a;题解 文章目录一、题目描述二、思路及代码实现1. 二分 排序2.…

【学习笔记】JDK源码学习之Vector(附带面试题)

【学习笔记】JDK源码学习之Vector&#xff08;附带面试题&#xff09; 什么是 Vector &#xff1f;它的作用是什么&#xff1f;它的底层由什么组成&#xff1f;是否是线程安全的&#xff1f; 老样子&#xff0c;跟着上面的问题&#xff0c;我们层层深入了解 Vector 吧。 1、…

Linux——linux面试题

cat a.txt | cut -d "/" -f 3 | sort | uniq -c |sort -nrgrep ESTABLISHED | awk -F " " {print $5} |cut -d ":" -f 1 | sort |uniq -c | sort -nr找回mysql的root用户的密码 首先&#xff0c;进入到/etc/my.cnf&#xff0c;插入一句skip-gra…

Apache Hudi Timeline

Timeline | Apache Hudi Hudi维护了在不同时刻在表上执行的所有操作的时间线&#xff0c;这有助于提供表的即时视图&#xff0c;同时也有效地支持按到达顺序检索数据。Hudi的核心是维护表上在不同的即时时间&#xff08;instants&#xff09;执行的所有操作的时间轴&#xff08…

windows下配置chrome浏览器驱动的详细攻略

要想使用python去爬取互联网上的数据&#xff0c;尤其是要模拟登录操作。那么selenium包肯定是绕不过的。 selenium包本质上就是通过后台驱动的方式驱动浏览器去。以驱动chrome浏览器为例&#xff0c;搭建环境如下&#xff1a; 1、查看本机chrome浏览器的版本。 方式是&#x…

第三十二章 linux-模块的加载过程二

第三十二章 linux-模块的加载过程二 文章目录第三十二章 linux-模块的加载过程二HDR视图的第二次改写模块导出的符号HDR视图的第二次改写 在这次改写中&#xff0c;HDR视图中绝大多数的section会被搬移到新的内存空间中&#xff0c;之后会根据这些section新的内存地址再次改写…

[附源码]计算机毕业设计Python“小世界”私人空间(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等…

知到/智慧树——程序设计基础(C语言)进阶篇

目录 第一章测试 第二章测试 第三章测试 第四章测试 第五章测试 第一章测试 第1部分总题数: 10 1 【单选题】 (10分) 在C语言中&#xff0c;将属于不同类型的数据作为一个整体来处理时&#xff0c;常用&#xff08; &#xff09;。 A. 简单变量 B. 数组类型数据 C. 结…

论文投稿指南——中文核心期刊推荐(力学)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

10.union all、N天连续登录

有日志如下&#xff0c;请写出代码求得所有用户和活跃用户的总数及平均年龄。&#xff08;活跃用户指连续两天都有访问记录的用户&#xff09; 数据准备 最后需完成的结果表 步骤1&#xff0c;所有用户的总数及平均年龄 (1). 将数据去重 with t1 as (select distinctuser_i…

如何使用交换机、路由器及防火墙进行组网以及他们之间的功能和区别

如何使用交换机、路由器及防火墙进行组网以及他们之间的功能和区别。 几乎大部分网络都有交换机、路由器和防火墙这三种基本设备,因此这三种设备对于网络而言非常重要,很多人对这三种设备的使用容易弄混。 一般网络部署: 或者抽象为这种部署模式: 几乎每个网络都有交换…

别再写jsp了,Thymeleaf它不香吗?

啥是 Thymeleaf在学 Thymeleaf 之前我们先看一下使用 jsp 开发遇到的主要问题&#xff1a;jsp 的痛点1.页面包含大量 java 代码&#xff0c;代码太混乱<% page contentType"text/html;charsetUTF-8" language"java" %> <html> <head> &l…

webpack实现自动代码编译

前置 使用webpack构建开发的代码&#xff0c;为了运行需要有两个操作&#xff1a; 操作一&#xff1a;npm run build&#xff0c;编译相关的代码。操作二&#xff1a;通过live server或者直接通过浏览器&#xff0c;打开index.html代码&#xff0c;查看效果。为了完成自动编译&…

《图解TCP/IP》阅读笔记(第五章 5.7、5.8)—— IP隧道与其他IP相关技术

5.7 IP隧道 IP隧道技术顾名思义&#xff0c;是用于在两片网络区域间直接建立通信的通路&#xff0c;而绕过此间的其他网络的一种技术&#xff0c;如下图所示&#xff1a; 网络A与网络B使用IPv6技术&#xff0c;使用IP隧道技术&#xff0c;便可以绕过网络C。 那么其工作原理是…

机器学习 波士顿房价预测 Boston Housing

目录 一&#xff1a;前言 二&#xff1a;模型预测(KNN算法) 三&#xff1a;回归模型预测比对 一&#xff1a;前言 波士顿房价是机器学习中很常用的一个解决回归问题的数据集 数据统计于1978年&#xff0c;包括506个房价样本&#xff0c;每个样本包括波士顿不同郊区房屋的13种…

SQL - MySQL回表

一、回表概念&#xff1b;现象 回表&#xff0c;顾名思义就是回到表中&#xff0c;也就是先通过普通索引&#xff08;我们自己建的索引不管是单列索引还是联合索引&#xff0c;都称为普通索引&#xff09;扫描出数据所在的行&#xff0c;再通过行主键ID 取出索引中未包含的数据…

[附源码]计算机毕业设计Python创新创业管理系统(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

Trie(Trie字符串统计)【实质就是二维数组 表示 链表】【二维数组的第一行就是 头结点】

欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09; 文章字体风格&#xff1a; 红色文字表示&#xff1a;重难点✔ 蓝色文字表示&#xff1a…