女主宣言

异常和错误处理在保证程序的鲁棒性方面起到了至关重要的作用。C++、Java、Python中的异常和错误处理都是比较类似的,可以用try-catch逻辑操作,但是Go中的异常处理却有别于以上三种语言。接下来就跟随作者一起看下在Go语言中,异常和错误是如何处理的吧。

PS:丰富的一线技术、多元化的表现形式,尽在“360云计算”,点关注哦!

1

异常处理

在异常处理方面,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捕获。

2

错误处理

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}

3

案例

案例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

下面程序的输出:

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。

上面程序输出如下:

360云计算

由360云平台团队打造的技术分享公众号,内容涉及数据库、大数据、微服务、容器、AIOps、IoT等众多技术领域,通过夯实的技术积累和丰富的一线实战经验,为你带来最有料的技术分享

go http 处理w.write 错误_Go语言中的异常和错误处理简介相关推荐

  1. Go语言中的异常和错误处理简介

    女主宣言 异常和错误处理在保证程序的鲁棒性方面起到了至关重要的作用.C++.Java.Python中的异常和错误处理都是比较类似的,可以用try-catch逻辑操作,但是Go中的异常处理却有别于以上三 ...

  2. PHP ERROR_php中的异常和错误浅析

    本文主要介绍了php中的异常和错误,分享给大家供大家参考学习,下面来一起看看详细的介绍: 一.异常与错误 异常是指程序运行中不符合预期情况以及与正常流程不同的状况.错误则属于自身问题,是一种非法语法或 ...

  3. c++中的异常--1(基本概念, c语言中处理异常,c++中处理异常,异常的基本使用,栈解旋)

    异常基本概念 异常处理就是处理程序中的错误,所谓错误是指在程序运行的过程中发生的一些异常事件(如:除0退出,数组下标越界,所要读取的文件不存在,空指针,内存不足等等) c语言中处理异常 两种方法: 使 ...

  4. JAVA语言异常,Java语言中的异常

    1.异常分类 从产生源头来看,Java语言中的异常可以分为两类: JVM抛出的异常.比如:访问null引用会引发NullPointerException:0作为除数,如9/0,JVM会抛出Arithm ...

  5. php 错误 异常,php中的异常和错误解析

    PHP错误是属于php程序自身的问题,一般是由非法的语法,环境问题导致的,使得编译器无法通过检查甚至无法运行的情况.PHP异常一般是业务逻辑上出现的不合预期.与正常流程不同的状况,不是语法错误.本文介 ...

  6. JAVA语言异常_Java语言中常用异常类EoFException是用来处理( )异常的类_学小易找答案...

    [填空题]Java语言中常用异常类ClassNotFoundException是用来处理 ( )的异常的类 [填空题]Java语言声明 ( ) 类为会产生"严重错误"的类 [简答题 ...

  7. Python:python语言中与时间有关的库函数简介、安装、使用方法之详细攻略

    Python:python语言中与时间有关的库函数简介.安装.使用方法之详细攻略 目录 与时间有关的库函数 案例应用 1.打印程序块前后运行时间 #T1.采用time库

  8. jmc线程转储_查找线程转储中的异常和错误

    jmc线程转储 线程转储是解决生产问题/调试生产问题的重要工件. 在像过去我们已经讨论了几种有效的线程转储故障模式: 堵车 , 跑步机 , RSI , 一个 LL条条大路通罗马 .......... ...

  9. java学习中,异常和错误的简介、捕获异常、抛出异常、自定义异常、finally关键字(java 学习中的小记录)

    java学习中,异常和错误的简介.捕获异常.抛出异常.自定义异常.finally关键字(java 学习中的小记录) 参考文章: (1)java学习中,异常和错误的简介.捕获异常.抛出异常.自定义异常. ...

最新文章

  1. 微信小程序客服功能 把当前页面的信息卡片发送给客服
  2. Python Socket编程基础篇
  3. 我的2019春招(前端暑期实习)记录
  4. 判断字符串的长度,中文占两个字符
  5. jmeter聚个报告怎么看qps_【jmeter】jmeter测试网站QPS
  6. Jetpack来了:走近Google标准应用架构
  7. multisim安装
  8. Manjaro-KDE安装动态桌面插件
  9. 阿里云国际版免费试用:如何注册以及注意事项
  10. switchport port-security aging
  11. 公开预算 publicize budget
  12. 广和通l610二次开发|广和通l610 CAT.1模组opencpu开发《二》cola_os移植
  13. 基于matlab的电炉温度控制算法比较,基于matlab的电炉温度控制算法比较及仿真研究...
  14. 百年奥运的相觑之温:尔疆我界,咫尺相见— 阿里云视频云「Cloud ME」
  15. Python之OpenGL笔记(37):散射光下的棋盘球体
  16. 项目因HealthKit被拒的分析与建议
  17. 【Java】Java学习笔记(2)——Java面向对象基础作业函数题
  18. 解决closing inbound before receiving peer‘s close_notify
  19. windows2008 r2,安装扫描仪驱动
  20. Quartus-II利用两个半加器实现简单全加器

热门文章

  1. rtmp 推送h264 + aac 的数据
  2. FFmpeg RTMP推HEVC/H265流
  3. 模拟退火粒子群优化算法控制程序
  4. GB28181协议支持的H264的PS封装实现
  5. linux卸载数据库后还在吗,oracle停止数据库后linux完全卸载oracle的详细步骤
  6. 03 | 事务隔离:为什么你改了我还看不见?
  7. 洛谷 1072 Hankson 的趣味题——质因数界限讨论
  8. Nginx安装成Windows服务
  9. 【核心API开发】Spark入门教程[3]
  10. kubernetes资源控制与及ingress插件安装(容忍策略)