golang错误处理机制:panic与recover
原文地址:http://www.niu12.com/article/14
panic知识点
package main import (
"fmt"
"github.com/pkg/errors"
) func main() {
outerFunc()
fmt.Println(1)
} func outerFunc() {
innerFunc()
} func innerFunc() {
panic(errors.New("An intended fatal error"))
} 当调用innerFunc 函数中的panic函数后,innerFunc 的执行会被停止。
紧接着,流程控制权会交回给调用方outerFunc函数。
然后, outerFunc函数的执行也将被停止。运行时恐慌就这样沿着调用栈反方向进行传播,
直至到达当前goroutine的调用栈的最顶层。-旦达到顶层,就意味着该goroutine调用栈
中所有函数的执行都已经被停止了,程序已经崩溃。
GO运行时系统也会调用panic() 函数
recover
运行时恐慌一旦被引发,就会向调用方传播直至程序崩溃。 Go 提供了专用于“拦截”
运行时恐慌的内建函数 recover ,它可以使气前的程序从恐慌状态中恢复并重新获
得流程控制权。 recover 函数被调川后,会返回一个 interfaoe { }类型的结果、
如果当时的程序正处于运行时恐慌的状态,那么这个结果就会是非 nil 的。 func innerFunc() {
defer func() {
if p := recover(); p != nil {
fmt.Printf("Recovered panic:%s\n", p)
}
}()
panic(errors.New("An intended fatal error"))
}
将defer 匿名函数放在函数体的开始处,可以有效防止该函数及其下层调用中的代码引发运行时恐慌 口可以把运行时恐慌的携带值转换为error类型值,并当作常规结果返回给调用方。
这样既阻止了恐慌的扩散,又传递了引起恐慌的原因。
口检查运行时恐慌携带值的类型,并根据类型做不同的后续动作,这样可以精确地
控制程序的错误处理行为。
golang错误处理机制:panic与recover的更多相关文章
- panic和recover的使用规则
转自个人博客 chinazt.cc 在上一节中,我们介绍了defer的使用. 这一节中,我们温习一下panic和recover的使用规则. 在golang当中不存在tye ... catch 异常处理 ...
- GOLANG错误处理最佳方案errors wrap, Defer, Panic, and Recover
Simple error handling primitives: https://github.com/pkg/errors Defer, Panic, and Recover: ...
- Golang错误处理函数defer、panic、recover、errors.New介绍
在默认情况下,当发生错误(panic)后,程序就会终止运行 如果发生错误后,可以捕获错误,并通知管理人员(邮件或者短信),程序还可以继续运行,这当然无可厚非 errors.New("错误信息 ...
- 【GoLang】panic defer recover 深入理解
唉,只能说C程序员可以接受go的错误设计,相比java来说这个设计真的很差劲! 我认为知乎上说的比较中肯的: 1. The key lesson, however, is that errors ar ...
- GO_05_2:Golang 中 panic、recover、defer 的用法
函数 defer 1. 它的执行方式类似其他语言中的折构函数,在函数体执行结束后按照调用顺序的 相反顺序 逐个执行 2. 即使函数发生 严重错误 也会被执行,类似于 java 中 try{...} ...
- Golang异常处理-panic与recover
Golang异常处理-panic与recover 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在程序设计中,容错是相当重要的一部分工作,在 Go中它是通过错误处理来实现的,err ...
- Golang 高效实践之defer、panic、recover实践
前言 我们知道Golang处理异常是用error返回的方式,然后调用方根据error的值走不同的处理逻辑.但是,如果程序触发其他的严重异常,比如说数组越界,程序就要直接崩溃.Golang有没有一种异常 ...
- Golang 入门系列(十四)defer, panic和recover用法
以前讲过golang 的基本语法.但是,只是讲了一些基础的语法,感兴趣的可以看看以前的文章,https://www.cnblogs.com/zhangweizhong/category/1275863 ...
- [Golang]-4 错误处理、Panic、Defer
目录 错误和异常 案例 Panic Defer 使用 defer+recover 来处理错误 参考文章: Go 语言使用一个独立的·明确的返回值来传递错误信息的.这与使用异常的 Java 和 Ruby ...
随机推荐
- HIbernate学习笔记1 之 简介
一.Hibernate的概念 hibernate是数据访问层的框架,对JDBC进行了封装,是针对数据库访问提出的面向对象的解决方案.使用它可以直接访问对象,自动将此访问转换为SQL执行,从而达到间接访 ...
- Java单线程多实例和多线程多实例
最近写了一个程序,是采用多线程往redis里面写入数据,想统计一下一共写了多少条数据,于是用了一个static的全局变量count来累加,这块代码抽象出来就是这样的: public class Mul ...
- opencv 图像转换
#include <cv.h> #include <highgui.h> int main() { CvPoint2D32f srcTri[], dstTri[]; CvMat ...
- Dubbo简单DEMO以及重要配置项
DEMO pom.xml 消费方和服务提供方一致 <properties> <spring.version>4.0.6.RELEASE</spring.version&g ...
- kafka 设置消费者线程数
http://blog.csdn.net/derekjiang/article/details/9053863 分布式发布订阅消息系统 Kafka 架构设计 - 目前见到的最好的Kafka中文文章 M ...
- 简写代码:当变量为false时['',false,null,undefined,0,NaN]时,返回默认值
当变量为'',false,null,undefined,0,NaN时,返回默认值 var a='' a || 'hello world' "hello world" var a ...
- SGU 202. The Towers of Hanoi Revisited
多柱汉诺塔问题. 引用自wiki百科 多塔汉诺塔问题 在有3个柱子时,所需步数的公式较简单,但对于4个以上柱子的汉诺塔尚未得到通用公式,但有一递归公式(未得到证明,但目前为止没有找到反例): 令为在有 ...
- python抓取网页图片的小案例
1.分析 ,要抓取的页面的信息以及对应的源码信息 blog.sina.com.cn/s/blog 93dc666c0101b1bj.html 2.代码模块: 导入正则表达的模块 导入url相关的模块 ...
- 字典树&01字典树算法笔记
1]学习了字典树之后,觉得它很明显的就是用空间来换时间,空间复杂度特别大,比如字典数单单存26个小写字母,那么每个节点的孩子节点都有26个孩子节点,字典树中的每一层都保留着不同单词的相同字母. 2]0 ...
- python3中使用xpath无法定位,为什么一直返回空列表?
tbody问题: 在爬去某些网站一些信息的时候,xpath工具上显示类容是正确的,但是在scrapy代码中一直返回空列表 Scrapy的部分代码: class LotteryspiderSpider( ...