1. errors包

Go 有一个预先定义的 error 接口类型 :

type error interface {
Error() string
}

错误值用来表示异常状态。Go也提供了一个包:errors,errors 包中有一个 errorString 结构体实现了 error 接口 。任何时候当你需要一个新的错误类型,都可以用 errors包的 errors.New 函数接收合适的错误信息来创建 :

err := errors.New("so.this is a error test")

2. 运行时异常和panic

我们在代码段中定义了一个error,这个error我们可以处理也可以不处理,它并不会影响程序继续往下执行;但是如果在程序中定义了一个panic,那程序是一定不会往下执行。

panic所定义的异常,是在程序运行到这里才触发,所以属于运行时异常。

	fmt.Print("start....")
panic("an error occured: stopping")
fmt.Print("end")

输出错误:

start....panic: an error occured: stopping

goroutine 1 [running]:
main.main()
D:/workspace/go/demo/testError.go:11 +0x9d

另外,如果panic函数遇到了defer延迟函数,在defer函数中触发了panic函数异常,会将该异常一直往上携带,一直输送到这个协程的起点:

package main

import (
"fmt"
) func defer1() {
panic("an error occured: stopping")
fmt.Println("defer1")
} func defer2() {
defer1()
fmt.Println("defer2")
} func main() {
fmt.Println("start....")
defer defer2()
fmt.Println("end") }

输出如下:

start....
end
panic: an error occured: stopping goroutine 1 [running]:
main.defer1(...)
D:/workspace/go/demo/testError.go:8
main.defer2()
D:/workspace/go/demo/testError.go:13 +0x41
main.main()
D:/workspace/go/demo/testError.go:22 +0xf7

可以看到异常信息一直被带到了main函数中。

那么既然有抛出异常,自然也会有异常捕获,recover就是这样的一个函数。

3. recover

正如名字一样,这个(recover)内建函数被用于从 panic 或 错误场景中恢复 。recover的使用方式是:必须的在defer修饰的方法中使用,不然不生效。原因你应该懂:panic抛出异常,defer具备延迟处理功能,所以最后这种兜底的活只能defer来做。

package main

import (
"fmt"
"log"
) func defer1() {
panic("an error occured: stopping")
fmt.Println("defer1")
} func defer2() {
defer func() {
if err := recover();err != nil{
log.Printf("panic: v%",err)
}
}()
defer1()
fmt.Println("defer2")
} func main() {
fmt.Println("start....")
defer2()
fmt.Println("end") }

输出:

start....
end
2019/04/02 00:08:01 panic: v%!(NOVERB)%!(EXTRA string=an error occured: stopping)

Go中的异常处理的更多相关文章

  1. 【repost】JS中的异常处理方法分享

    我们在编写js过程中,难免会遇到一些代码错误问题,需要找出来,有些时候怕因为js问题导致用户体验差,这里给出一些解决方法 js容错语句,就是js出错也不提示错误(防止浏览器右下角有个黄色的三角符号,要 ...

  2. 第65课 C++中的异常处理(下)

    1. C++中的异常处理 (1)catch语句块可以抛出异常 ①catch中获捕的异常可以被重新抛出 ②抛出的异常需要外层的try-catch块来捕获 ③catch(…)块中抛异常的方法是throw; ...

  3. Swift基础--Swift中的异常处理

    Swift中的异常处理 OC中的异常处理:方法的参数要求传入一个error指针地址,方法执行完后,如果有错误,内部会给error赋值 Swift中的异常处理:有throws的方法,就要try起来,然后 ...

  4. ASP.NET Web API 中的异常处理(转载)

    转载地址:ASP.NET Web API 中的异常处理

  5. Struts2中的异常处理

    因为在Action的execute方法声明时就抛出了Exception异常,所以我们无需再execute方法中捕捉异常,仅需在struts.xml 中配置异常处理. 为了使用Struts2的异常处理机 ...

  6. C++中的异常处理(三)

    C++中的异常处理(三) 标签: c++C++异常处理 2012-11-24 23:00 1520人阅读 评论(0) 收藏 举报  分类: 编程常识(2)  版权声明:本文为博主原创文章,未经博主允许 ...

  7. C++中的异常处理(二)

    C++中的异常处理(二) 标签: c++C++异常处理 2012-11-24 20:56 1713人阅读 评论(2) 收藏 举报  分类: C++编程语言(24)  版权声明:本文为博主原创文章,未经 ...

  8. C++中的异常处理(一)

     来自:CSDN 卡尔  后续有C++中的异常处理(二)和C++中的异常处理(三),C++中的异常处理(二)是对动态分配内存后内部发生错误情况的处理方法,C++中的异常处理(三)中是使用时的异常说明. ...

  9. Java中实现异常处理的基础知识

    Java中实现异常处理的基础知识 异常 (Exception):发生于程序执行期间,表明出现了一个非法的运行状况.许多JDK中的方法在检测到非法情况时,都会抛出一个异常对象. 例如:数组越界和被0除. ...

  10. java 中的异常处理

    一. 异常的概念和Java异常体系结构  异常是程序运行过程中出现的错误.本文主要讲授的是Java语言的异常处理.Java语言的异常处理框架,     是Java语言健壮性的一个重要体现. Java把 ...

随机推荐

  1. Go - 循环

    目录 概述 循环 array 循环 slice 循环 map break continue goto switch 推荐阅读 概述 前几篇文章分享了 array 数组.slice 切片.map 集合, ...

  2. 线性表的顺序存储C++代码实现

      关于线性表的概念,等相关描述请参看<大话数据结构>第三章的内容, 1 概念   线性表list:零个或多个数据的有限序列.   可以这么理解:糖葫芦都吃过吧,它就相当于一个线性表,每个 ...

  3. cookie 和 session 设置

    cookie: 保存在浏览器上的一组键值对, 是由服务器让浏览器进行设置的 下次浏览器访问的时候会携带cookie. request是客户端请求, response是服务端响应. 读取客户端的cook ...

  4. VS2013日常使用若干技巧+快捷键

    1.注释的方法 1)sqlserver中,单行注释:— —   多行注释:/* 代码  */ 2)C#中,单行注释://    多行注释:/* 代码  */ 3)C#中多行注释的快捷方式:先选中你要注 ...

  5. 【linux杂谈】在SSH连接中,openssh如何解决'Connection refused'错误?

    openssh是SSH (Secure SHell) 协议的免费开源实现.SSH协议族可以用来进行远程控制, 或在计算机之间传送文件. 这就意味着远程登陆,文件推拉特别是搭建集群后公钥的部署,经常要利 ...

  6. 《ASP.NET Core 高性能系列》致敬伟大的.NET斗士甲骨文!

    写在开始 三年前,曾写过一篇文章:从.NET和Java之争谈IT这个行业,当时遭到某些自认为懂得java就了不起的Javaer抨击, 现在可以致敬伟大的.NET斗士甲骨文了 (JDK8以上都需要收费, ...

  7. Bzoj 1040 [ZJOI2008]骑士 题解

    1040: [ZJOI2008]骑士 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5368  Solved: 2044[Submit][Status ...

  8. 硬件笔记之Thinkpad T470P更换2K屏幕

    0x00 前言 手上的Thinkpad T470P屏幕是1920x1080的屏幕,色域范围NTSC 45%,作为一块办公用屏是正常配置,但是考虑到色彩显示和色域范围,计划升级到2K屏幕. 2k屏幕参数 ...

  9. 小埋的Dancing Line之旅:比赛题解&热身题题解

    答疑帖: 赞助团队:UMR IT Team和洛谷大佬栖息地 赛后题解:更新了那两道练手题的题解 赛时公告,不过一些通知也可能在团队宣言里发出 如果各位发现重题,请将你认为重复的题目链接连同这次比赛的题 ...

  10. Oculus Rift 没有声音的解决方法

    If you do not hear any audio when using Rift, please try the following steps: Check the Rift audio s ...