DataWhale & Golang(十、异常处理)


学习大纲:


目录

DataWhale & Golang(十、异常处理)

学习大纲

10.异常处理

10.1 error

注意

10.2 panic

注意

10.3 源码分析


10.异常处理

10.1 error

Go语言内置了一个简单的错误接口作为一种错误处理机制,接口定义如下:

type error interface {Error() string
}

它包含一个 `Error()` 方法,返回值为`string`

Go的error构造有两种方式,分别是

第一种:errors.New()
err := errors.New("This is an error")
if err != nil {fmt.Print(err)
}
第二种:fmt.Errorf()
err := fmt.Errorf("This is an error")
if err != nil {fmt.Print(err)
}

除了直接使用Go自带的方法,还可以自定义错误。下面以自然数函数作为例子:

type NotNature float64func (err NotNature) Error() string {return fmt.Sprintf("自然数为大于或等于0的数: %v", float64(err))
}func Nature(x float64) (float64,error) {if x<0 {return 0,NotNature(x)} else {return x,nil}
}func main() {fmt.Println(Nature(1))fmt.Println(Nature(-1))
}

注意:

  • 1.如果函数需要处理异常,通常将error作为多值返回的最后一个值,返回的error值为nil则表示无异常,非nil则是有异常。
  • 2.一般先用if语句处理error!=nil,正常逻辑放if后面。

Go语言的error代表的并不是真“异常”,只是通过返回error来表示错误信息,换句话说,不是运行时错误范围预定义的错误,某种不符合期望的行为并不会导致程序无法运行(自然数函数例子),都应使用error进行异常处理。当程序出现重大错误,如数组越界,才会将其当成真正的异常,并用**panic**来处理。

10.2 panic

Go不使用try...catch方法来处理异常,而是使用panic和recover

先上代码举一个简单的例子

func main() {fmt.Println("Hello,Go!")panic(errors.New(" i am a error"))fmt.Println("hello,again!")
}
输出:
Hello,Go!
panic:  i am a errorgoroutine 1 [running]:
main.main()~/error.go:12 +0xb5
exit status 2

可以看到,panic后面的程序不会被执行了。但是我们捕捉异常并不是为了停止程序(一般情况),而是为了让程序能正常运行下去,这时候就到recover出场了。

package mainimport "fmt"func main(){defer func(){fmt.Println("我是defer里面第一个打印函数")if err:=recover();err!=nil{fmt.Println(err)}fmt.Println("我是defer里面第二个打印函数")}()f()
}func f(){fmt.Println("1")panic("我是panic")fmt.Println("2")
}
1
我是defer里面第一个打印函数
我是panic
我是defer里面第二个打印函数

可以看到,f函数一开始正常打印,当遇到panic,就跳到defer函数,执行defer函数里的内容

需要注意的是,defer函数里打印的err其实就是panic里面的内容。

下面详细介绍一下panic和recover的原理。

func panic(v interface{})//  内置函数panic会停止当前goroutine的正常执行。当函数F调用panic时,F的正常执行立即停止。任何被F延迟执行的函数都将以正常的方式运行,然后F返回其调用者。
//  对调用方G来说,对F的调用就像调用panic一样,终止G的执行并运行任何延迟的函数。直到执行goroutine中的所有函数都按逆序停止。此时,程序将以非0退出代码终止。此终止序列称为panicking,可由内置函数recover控制。
func recover() interface{}
// recover内置函数允许程序管理panicking的goroutine的行为。
// 在defer函数(但不是它调用的任何函数)内执行恢复调用,通过恢复正常执行来停止panicking序列,并检索传递给panic调用的错误值。
// 如果在defer函数之外调用recover,则不会停止panicking的序列。在这种情况下,或者当goroutine不panicking时,或者提供给panic的参数是nil,recover返回nil。因此,recover的返回值报告goroutine是否panicking

注意:

defer和recover必须在panic之前定义,否则无效。

10.3 源码分析

errors.New的定义如下

// src/errors/errors.go
// New returns an error that formats as the given text.
// Each call to New returns a distinct error value even if the text is identical.
func New(text string) error {return &errorString{text}
}// errorString is a trivial implementation of error.
type errorString struct {s string
}func (e *errorString) Error() string {return e.s
}
  • 1.New函数返回格式为给定文本的错误
  • 2.即使文本是相同的,每次对New的调用都会返回一个不同的错误值。

DataWhale Golang(十、异常处理)相关推荐

  1. springmvc三十:异常处理流程

    handlerExceptionResolvers 异常解析也是springmvc的9大组件之一. DispatcherServlet.properties中默认的异常解析如下: org.spring ...

  2. Datawhale第十二期组队学习--Python爬虫编程实践 Task03:session和cookie、代理、selenium自动化 拔高:丁香园留言板爬取

    一. session和cookie 常用的 web 容器有 Nginx . Apache . Tomcat .Weblogic . Jboss . Resin 等等 http 1.0 HTTP1.0的 ...

  3. Go语言的错误异常处理机制及其应用

    一.背景 在日常编写golang程序或阅读别人的golang代码时,我们总会看到如下的一堆代码块: xx, err = func(xx) if err != nil {//do sth. to tac ...

  4. 多重句柄怎么处理_golang异常处理详解

    小熊今天有意外收获,忍不住给大家分享我愉快的心情!昨天中午下楼取外卖的时候被一个同事认出来了,他问我:"是不是[编程三分钟]的作者,文章写的不错". 你知道吗!我当时就是一愣,然后 ...

  5. Go语言重新开始,Go Modules 的前世今生与基本使用

    随着Go语言发展与场景变化, GOPATH 引起的编译依赖.内部自签发证书.安全审计等问题相继出现,随着官方推出的Go Modules逐渐完善,用户有了新的选择.本文将会带领大家从0开始,认识并使用G ...

  6. 唯品会Java开发手册

    <唯品会Java开发手册>1.0.2版 概述 <阿里巴巴Java开发手册>,是首个对外公布的企业级Java开发手册,对整个业界都有重要的意义. 我们结合唯品会的内部经验,参考& ...

  7. 【2021.05--集成学习(下)-Task15】蒸汽预测案例

    本次 DataWhale 第二十五期组队学习,其开源内容的链接为:https://github.com/datawhalechina/team-learning-data-mining/tree/ma ...

  8. 【2021.03--集成学习(上)】使用 sklearn 构建完整的机器学习项目流程

    本次 DataWhale 第二十三期组队学习,其开源内容的链接为:[https://github.com/datawhalechina/team-learning-data-mining/tree/m ...

  9. 数据可视化之饼状图(原理+Python代码)

    数据来源于Kaggle数据集,链接:https://www.kaggle.com/Cornell-University/arxiv 目录 00.前言 一.原理介绍 二.代码实现 三.结果解释 00.前 ...

最新文章

  1. Go 学习笔记(37)— 标准命令(go build 跨平台编译、交叉编译、go clean、go run、go fmt、go install、go get)
  2. K-近邻算法之交叉验证,网格搜索
  3. QT删除QWidget或QLayout下的控件
  4. [CODEVS 1301] 任务分配
  5. 客户端相关知识学习(三)之Android原生与H5交互的实现
  6. 二、Web服务器——ServletHTTPRequest笔记
  7. Python排序算法(一)冒泡排序、选择排序、插入排序
  8. android hdmi开关,Android – 禁用HDMI
  9. Oracle 导出部分表结构,以及导入
  10. SpringMVC之HelloWorld
  11. [Web Chart系列之五] 4. 实战draw2d(Raphael)之取消Chrome中Label Text 全部选中
  12. java set集合与List集合练习
  13. 使用代码形式配置Log4J日志框架
  14. python 分布式存储_Amazon S3 分布式存储的 python 接口实现
  15. Anacoda 介绍、安装、环境切换
  16. C++ DNF脚本源码模板开源
  17. TCP/IP基础知识--华为数通部门讲解
  18. 二叉树数组求前中后序遍历
  19. 在写移动端页面的布局的时候是按照iphone6的尺寸写的,在iphone5中因为宽度的问题导致样式错乱
  20. oracle dbf文件读取,读取oracle数据表,导出到DBF文件。

热门文章

  1. censo7安装mysql_centos7 安装MySQL
  2. HDU-4414 Finding crosses
  3. C语言:实现蛇形数组
  4. A - 可以教学姐画画嘛QAQ
  5. 搭建表白墙 公众号_韶大表白墙 第十季 第75期 | 篮球共青杯决赛体教1班穿黑色衣服的0号...
  6. RoboMaster汇总
  7. 信息学奥赛一本通:1084:幂的末尾
  8. Spring Boot使用qq邮箱实现验证码发送
  9. P8685 [蓝桥杯 2019 省 A] 外卖店优先级
  10. java的ide是什么_什么是IDE,java开发的ide是什么?