Go中的异常处理
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中的异常处理的更多相关文章
- 【repost】JS中的异常处理方法分享
我们在编写js过程中,难免会遇到一些代码错误问题,需要找出来,有些时候怕因为js问题导致用户体验差,这里给出一些解决方法 js容错语句,就是js出错也不提示错误(防止浏览器右下角有个黄色的三角符号,要 ...
- 第65课 C++中的异常处理(下)
1. C++中的异常处理 (1)catch语句块可以抛出异常 ①catch中获捕的异常可以被重新抛出 ②抛出的异常需要外层的try-catch块来捕获 ③catch(…)块中抛异常的方法是throw; ...
- Swift基础--Swift中的异常处理
Swift中的异常处理 OC中的异常处理:方法的参数要求传入一个error指针地址,方法执行完后,如果有错误,内部会给error赋值 Swift中的异常处理:有throws的方法,就要try起来,然后 ...
- ASP.NET Web API 中的异常处理(转载)
转载地址:ASP.NET Web API 中的异常处理
- Struts2中的异常处理
因为在Action的execute方法声明时就抛出了Exception异常,所以我们无需再execute方法中捕捉异常,仅需在struts.xml 中配置异常处理. 为了使用Struts2的异常处理机 ...
- C++中的异常处理(三)
C++中的异常处理(三) 标签: c++C++异常处理 2012-11-24 23:00 1520人阅读 评论(0) 收藏 举报 分类: 编程常识(2) 版权声明:本文为博主原创文章,未经博主允许 ...
- C++中的异常处理(二)
C++中的异常处理(二) 标签: c++C++异常处理 2012-11-24 20:56 1713人阅读 评论(2) 收藏 举报 分类: C++编程语言(24) 版权声明:本文为博主原创文章,未经 ...
- C++中的异常处理(一)
来自:CSDN 卡尔 后续有C++中的异常处理(二)和C++中的异常处理(三),C++中的异常处理(二)是对动态分配内存后内部发生错误情况的处理方法,C++中的异常处理(三)中是使用时的异常说明. ...
- Java中实现异常处理的基础知识
Java中实现异常处理的基础知识 异常 (Exception):发生于程序执行期间,表明出现了一个非法的运行状况.许多JDK中的方法在检测到非法情况时,都会抛出一个异常对象. 例如:数组越界和被0除. ...
- java 中的异常处理
一. 异常的概念和Java异常体系结构 异常是程序运行过程中出现的错误.本文主要讲授的是Java语言的异常处理.Java语言的异常处理框架, 是Java语言健壮性的一个重要体现. Java把 ...
随机推荐
- Go - 循环
目录 概述 循环 array 循环 slice 循环 map break continue goto switch 推荐阅读 概述 前几篇文章分享了 array 数组.slice 切片.map 集合, ...
- 线性表的顺序存储C++代码实现
关于线性表的概念,等相关描述请参看<大话数据结构>第三章的内容, 1 概念 线性表list:零个或多个数据的有限序列. 可以这么理解:糖葫芦都吃过吧,它就相当于一个线性表,每个 ...
- cookie 和 session 设置
cookie: 保存在浏览器上的一组键值对, 是由服务器让浏览器进行设置的 下次浏览器访问的时候会携带cookie. request是客户端请求, response是服务端响应. 读取客户端的cook ...
- VS2013日常使用若干技巧+快捷键
1.注释的方法 1)sqlserver中,单行注释:— — 多行注释:/* 代码 */ 2)C#中,单行注释:// 多行注释:/* 代码 */ 3)C#中多行注释的快捷方式:先选中你要注 ...
- 【linux杂谈】在SSH连接中,openssh如何解决'Connection refused'错误?
openssh是SSH (Secure SHell) 协议的免费开源实现.SSH协议族可以用来进行远程控制, 或在计算机之间传送文件. 这就意味着远程登陆,文件推拉特别是搭建集群后公钥的部署,经常要利 ...
- 《ASP.NET Core 高性能系列》致敬伟大的.NET斗士甲骨文!
写在开始 三年前,曾写过一篇文章:从.NET和Java之争谈IT这个行业,当时遭到某些自认为懂得java就了不起的Javaer抨击, 现在可以致敬伟大的.NET斗士甲骨文了 (JDK8以上都需要收费, ...
- Bzoj 1040 [ZJOI2008]骑士 题解
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5368 Solved: 2044[Submit][Status ...
- 硬件笔记之Thinkpad T470P更换2K屏幕
0x00 前言 手上的Thinkpad T470P屏幕是1920x1080的屏幕,色域范围NTSC 45%,作为一块办公用屏是正常配置,但是考虑到色彩显示和色域范围,计划升级到2K屏幕. 2k屏幕参数 ...
- 小埋的Dancing Line之旅:比赛题解&热身题题解
答疑帖: 赞助团队:UMR IT Team和洛谷大佬栖息地 赛后题解:更新了那两道练手题的题解 赛时公告,不过一些通知也可能在团队宣言里发出 如果各位发现重题,请将你认为重复的题目链接连同这次比赛的题 ...
- Oculus Rift 没有声音的解决方法
If you do not hear any audio when using Rift, please try the following steps: Check the Rift audio s ...