原文地址: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的更多相关文章

  1. panic和recover的使用规则

    转自个人博客 chinazt.cc 在上一节中,我们介绍了defer的使用. 这一节中,我们温习一下panic和recover的使用规则. 在golang当中不存在tye ... catch 异常处理 ...

  2. GOLANG错误处理最佳方案errors wrap, Defer, Panic, and Recover

    Simple error handling primitives:        https://github.com/pkg/errors Defer, Panic, and Recover:    ...

  3. Golang错误处理函数defer、panic、recover、errors.New介绍

    在默认情况下,当发生错误(panic)后,程序就会终止运行 如果发生错误后,可以捕获错误,并通知管理人员(邮件或者短信),程序还可以继续运行,这当然无可厚非 errors.New("错误信息 ...

  4. 【GoLang】panic defer recover 深入理解

    唉,只能说C程序员可以接受go的错误设计,相比java来说这个设计真的很差劲! 我认为知乎上说的比较中肯的: 1. The key lesson, however, is that errors ar ...

  5. GO_05_2:Golang 中 panic、recover、defer 的用法

     函数 defer 1. 它的执行方式类似其他语言中的折构函数,在函数体执行结束后按照调用顺序的 相反顺序 逐个执行 2. 即使函数发生 严重错误 也会被执行,类似于 java 中 try{...} ...

  6. Golang异常处理-panic与recover

    Golang异常处理-panic与recover 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在程序设计中,容错是相当重要的一部分工作,在 Go中它是通过错误处理来实现的,err ...

  7. Golang 高效实践之defer、panic、recover实践

    前言 我们知道Golang处理异常是用error返回的方式,然后调用方根据error的值走不同的处理逻辑.但是,如果程序触发其他的严重异常,比如说数组越界,程序就要直接崩溃.Golang有没有一种异常 ...

  8. Golang 入门系列(十四)defer, panic和recover用法

    以前讲过golang 的基本语法.但是,只是讲了一些基础的语法,感兴趣的可以看看以前的文章,https://www.cnblogs.com/zhangweizhong/category/1275863 ...

  9. [Golang]-4 错误处理、Panic、Defer

    目录 错误和异常 案例 Panic Defer 使用 defer+recover 来处理错误 参考文章: Go 语言使用一个独立的·明确的返回值来传递错误信息的.这与使用异常的 Java 和 Ruby ...

随机推荐

  1. 全国省市区数据SQL - 省市区

    转载:https://www.cnblogs.com/flywind/p/6036801.html

  2. position:fixed部分版本的浏览器不支持

    ie6-ie8浏览器不支持这个属性 .fixed{         position:fixed; /*对于火狐等其他浏览器需要设置的*/         top:700px;  /*同上*/     ...

  3. 写微信API所遇到的问题

    1.接口还没出来之前. 根据微信网页版的页面,自己做了页面,分成了两个页面,一个是登录之后的,一个是登录之前的.后来接口出来之后我师兄说要做成只有一个页面时,我就有点吓到了,想想都觉得难,后来用了JQ ...

  4. [USACO06NOV]路障---严格次短路

    Description 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样, ...

  5. 提高C#编程水平的50个要诀

    一篇旧时的文章,看后觉得还可以,特别贴出来. 提高C#编程水平的50个要点: .总是用属性 (Property) 来代替可访问的数据成员 .在 readonly 和 const 之间,优先使用 rea ...

  6. 微信小程序-表格形式如何布局?

    微信小程序没有现成的table标签,该怎么布局呢? <view class="my-grids"> <block wx:for="{{grids}}&q ...

  7. Go语言标准库之log包

    用来作日志log输出的, 比较易懂. 今天周六啊,在公司加班学习一下呀. package main import ( "log" ) func init() { log.SetPr ...

  8. [BZOJ4025] 二分图 LCT/(线段树分治+并查集)

    4025: 二分图 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2667  Solved: 989[Submit][Status][Discuss] ...

  9. 微软企业库5.0 学习之路——第七步、Cryptographer加密模块简单分析、自定义加密接口及使用—下篇

    在上一篇文章中, 我介绍了企业库Cryptographer模块的一些重要类,同时介绍了企业库Cryptographer模块为我们提供的扩展接口,今天我就要根据这些 接口来进行扩展开发,实现2个加密解密 ...

  10. 六十五 async/await

    用asyncio提供的@asyncio.coroutine可以把一个generator标记为coroutine类型,然后在coroutine内部用yield from调用另一个coroutine实现异 ...