一、异常处理

在异常处理方面,Go语言不像其他语言,使用try..catch.. finall..., 而使用defer, panic, recover,将异常和控制流程区分开。即通过panic抛出异常,然后在defer中,通过recover捕获这个异常,最后处理。

先来看一个案例吧,如下:func main() {

//立即执行函数

defer func(){ //   声明defer,

fmt.Println("----调用 defer1 start----")

if err:=recover(); err!=nil{

fmt.Println(err) // 这里的err其实就是panic传入的内容

}

fmt.Println("----调用 defer1 end----")

}()

defer func(){ //   声明defer,

fmt.Println("----调用 defer2 start----")

if err:=recover(); err!=nil{

fmt.Println(err) // 这里的err其实就是panic传入的内容

}

fmt.Println("----调用 defe2r end----")

}()

panic("测试")

}

执行结果:

defer的思想类似于C++中的析构函数,就是在程序结束前执行的语句,defer后面可以是一个立即执行函数,也可以是一条语句。

defer可以多次,这样形成一个defer栈,后添加的会先被调用。

panic 是用来表示非常严重的不可恢复的错误的。在Go语言中这是一个内置函数,接收一个interface{}类型的值(也就是任何值了)作为参数。

panic的作用就像我们平常接触的异常,所以,调用panic会让程序不会继续往下执行(除非recover)。

recover捕获异常后的异常,不能再次被recover捕获。

二、错误处理

Go标准包提供的错误处理功能,error是个interface,如下:type error interface {

Error() string

}

且go提供了errorString结构体,其则实现了error接口,如下:// errorString is a trivial implementation of error.

type errorString struct {

s string

}

func (e *errorString) Error() string {

return e.s

}

在errors包中,还提供了New函数,来实例化errorString,如下:// New returns an error that formats as the given text.

func New(text string) error {

return &errorString{text}

}

于是,在定义函数的时候,我们就可以如下:func add(args ... int) (int, error){

var sum int

if len(args) == 0 {

return 0, errors.New("参数为空")

}

for _ ,arg := range args {

sum += arg

}

return sum, nil

}

调用://立即执行函数

sum , err := add()

if err != nil {

fmt.Println(err.Error())

} else {

fmt.Println(sum)

}

输出:

当然,我们也可以自己去实现error接口,如下:type myError struct {

curFile     string

code        int

description string

}

//实现Error方法,那么myError就实现了error接口

func (e *myError) Error() string {

return e.description

}

然后在函数中,使用我们自己定义的错误,如下:func add(args ... int) (int, error) {

var sum int

if len(args) == 0 {

return 0, &myError{curFile: "test.go", code: -1, description: "参数不能为空哦!"}

}

for _, arg := range args {

sum += arg

}

return sum, nil

}

三、案例

1、案例1

下面程序的输出:package main

import (

"fmt"

)

func main() {

doTest()

}

func doTest() {

defer func() {

panic("报错2")

}()

defer func() {

panic("报错1")

}()

panic("报错3")

}

解析:defer可以多次,这样形成一个defer栈,后添加的会先被调用,所以输出“报错1”应该在“报错2”之前,且defer有点类似析构函数,所以输出“报错3”在“报错1”之前。

上面程序输出如下:

2、案例2

下面程序的输出:package main

import (

"fmt"

)

func main() {

doTest()

fmt.Println("main捕获到错误:", recover())

}

func doTest() {

defer func() {

fmt.Println("1捕获到错误:", recover())

}()

fmt.Println("2捕获到错误:", recover())

panic("报错3")

}

分析: recover 只有在 defer 调用的函数中才有效,否则当panic时,recover无法捕获到panic,变回输出nil。

上面程序输出如下:

recover 没有捕获异常_Go的异常处理defer, panic, recover以及错误处理相关推荐

  1. recover 没有捕获异常_GO语言异常处理机制panic和recover分析

    本文实例分析了GO语言异常处理机制panic和recover.分享给大家供大家参考.具体如下: Golang 有2个内置的函数 panic() 和 recover(),用以报告和捕获运行时发生的程序错 ...

  2. Go的异常处理 defer, panic, recover

    Go的异常处理 defer, panic, recover 参考文章: (1)Go的异常处理 defer, panic, recover (2)https://www.cnblogs.com/ghj1 ...

  3. go defer,panic,recover详解 go 的异常处理

    golang中defer,panic,recover是很常用的三个特性,三者一起使用可以充当其他语言中try-catch-的角色,而defer本身又像其他语言的析构函数 defer defer后边会接 ...

  4. Go案例说明defer panic recover

    defer推迟  recover恢复  panic恐慌 通过一个案例解释:发送邮件的 发送不成功要修改数据表的邮件发送状态值 发送邮件的内部sendEmail出现错误  要去修改数据表的状态值了 发送 ...

  5. go语言错误和异常处理,panic、defer、recover的执行顺序

    一.panic()和recover() Golang中引入两个内置函数panic和recover来触发和终止异常处理流程,同时引入关键字defer来延迟执行defer后面的函数. 一直等到包含defe ...

  6. go panic recover 异常处理

    go panic recover 异常处理 参考文章: (1)go panic recover 异常处理 (2)https://www.cnblogs.com/zhishuai/p/8043064.h ...

  7. golang panic recover return defer的逻辑顺序问题

    package mainimport "fmt"//验证golang return defer recover 之间的顺序关系func main() {defer func() { ...

  8. go 异常捕获和处理(panic/recover)

    异常处理 Golang 没有结构化异常,使用 panic 抛出错误,recover 捕获错误. 异常的使用场景简单描述:Go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个 ...

  9. go panic recover 思考

    panic 作为 Go 异常的一种,类比其它语言的 Exception. 常见的 panic 有数组下标越界,或者除数为0,这类 panic 可以通过 recover 进行捕获.但要特别注意,程序发生 ...

  10. Go: panic / recover 简介与实践

    文章目录 简介 1.特性 2.panic触发流程 3.recover使用要点 4.使用场景 一.实践 1.跨线程失效 2.不起作用的recover 3.嵌套使用panic 4.注意事项 小结 简介 g ...

最新文章

  1. LVS实现负载均衡及高可用
  2. 芯片老化验证流程_如何正确评估芯片的老化程度?
  3. 使用XML模板在excel进行配置
  4. 如何在Node JS中卸载NPM模块?
  5. 一个9年的技术最近一直担心找不到工作
  6. access开发精要(4)-参考与查阅
  7. 自然语言处理入门指北 之 one-hot
  8. initialization of 'XXX' is skipped by 'case' label
  9. html css 知识回顾2
  10. 10.3 考试 (考得不好)
  11. minianaconda安装图形化界面
  12. 阿里云java面试_20个高级Java面试题汇总
  13. 2022-01-31的新年flag
  14. Java中的静态变量、静态方法问题
  15. Loopback for Mac虚拟音频传输管理工具
  16. 七年级上册计算机教学反思,七年级信息技术上册教学反思
  17. linux设置gmt时区,关于GMT UTC CST和Linux时区设置
  18. mc服务器文件夹改皮肤,我的世界皮肤放在哪个文件夹位置及更换方法解析
  19. 一个系列搞懂Mysql数据库12:从实践sql语句优化开始
  20. 华为 5G 欧洲崛起!

热门文章

  1. 大数据时代,如何做商业智能产品选型
  2. 浙江省乡村快递寄件数据分析-快递100百递指数
  3. 史上最全 MCC(移动国家码)和 MNC(移动网络码)
  4. 211大学计算机找工作,华为最青睐的5所大学,每年招聘大量毕业生,第一所只是211院校...
  5. 【魔兽世界插件】魔兽世界插件实战笔记从入门到放弃的心理历程 第一节 lua框架的建立
  6. 如何阅读一本好书:APUE
  7. 数据挖掘之数据处理——SVM神经网络的数据分类预测-意大利葡萄酒种类识别
  8. win7系统蓝牙功能怎么开启
  9. Softmax回归是什么?(多元逻辑回归)
  10. java连接twitter登录,android中接入twitter进行第三方登录