简言

在其他语言里,宕机往往以异常的形式存在,底层抛出异常,上层逻辑通过 try/catch 机制捕获异常,没有被捕获的严重异常会导致宕机

go语言追求简洁,优雅,Go语言不支持传统的 try…catch…finally 这种异常

Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱

Go语言,可以使用多值返回来返回错误。不要用异常代替错误,更不要用来控制流程。在极个别的情况下,才使用Go中引入的Exception处理:defer, panic, recover

Go中,对异常处理的原则是:多用error包,少用panic

panic() 函数

函数中遇到panic语句,会立即终止当前函数的执行,在panic所在函数内如果存在要执行的defer函数列表,按照defer的逆序执行

recover() 函数

recover函数的返回值报告协程是否正在遭遇panic

有异常时,recover()只能调用一次,后面再次调用则捕获不到任何异常

通常办法:go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理,从而恢复正常代码的执行

实验如下图:

实验代码如下(已添加详细注释,不再一一详述):

package main
import ("fmt""runtime/debug"
)// 异常处理函数1
func panicDeal1() {fmt.Println("panicDeal1,begin")if err := recover(); err != nil {fmt.Println("err1:", err)          // 打印出异常(由于panicDeal2()中的recover函数已经捕获了异常,所以这里捕获不到异常,不会得到执行)fmt.Println(string(debug.Stack())) // 打印出堆栈信息}fmt.Println("panicDeal1,end")
}// 异常处理函数2
func panicDeal2() {fmt.Println("panicDeal2,begin")if err := recover(); err != nil {fmt.Println("err2", err)           // 打印出异常fmt.Println(string(debug.Stack())) // 打印出堆栈}fmt.Println("panicDeal2,end")
}func test() {fmt.Println("1111")// 必须先声明defer,否则不能捕获panic异常defer panicDeal1()// 触发panic时,逆序执行,也就是先执行 panicDeal2(),再执行 panicDeal1()defer panicDeal2()fmt.Println("2222")// 空指针赋值,产生崩溃var p *int*p = 1// 这里的代码得不到执行fmt.Println("3333")
}func main() {test()
}

go 异常捕获处理 panic defer recover相关推荐

  1. Go 异常捕获处理: panic(err) 与 recover()

    代码实例 func (rcvr *CQL) Compile(ctx context.Context) string {defer func() {if err := recover(); err != ...

  2. go 异常捕获和处理(panic/recover)

    异常处理 Golang 没有结构化异常,使用 panic 抛出错误,recover 捕获错误. 异常的使用场景简单描述:Go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个 ...

  3. go语言中的defer、panic、recover处理异常

    go语言中的defer就像c++中的析构函数,但是go语言中defer的对象是函数(或者对象的方法),defer能保证在函数结束最后执行该方法(函数),但是有例外:如果在定义的方法中defer定义的方 ...

  4. go的错误处理(异常捕获、处理):defer+recover机制处理错误、自定义异常(自定义错误)

    defer+recover机制处理错误 [1]展示错误: 发现:程序中出现错误/恐慌以后,程序被中断,无法继续执行. [2]错误处理/捕获机制: go中追求代码优雅,引入机制:defer+recove ...

  5. go的异常处理,defer,panic,recover

    比较经典的一个例子,里面包含defer,panic,recover 例子代码: package main import "fmt" func main(){ defer func( ...

  6. 在golang中defer、panic与recover的作用

    package mainimport "fmt"func main() {var s strings = "panic"fmt.Printf("a的初 ...

  7. Golang 错误捕获 Panic 与 Recover

    Golang 错误捕获 Panic 与 Recover,我抓住你了,Error Golang轻松学习 文章目录 Golang 错误捕获 Panic 与 Recover,我抓住你了,Error 一.Go ...

  8. 关键字之defer、panic、recover

    一.defer                1. defer延迟调用,完成一些收尾工作.无论函数或方法是否出错,一定会在退出当前函数或者方法之前调用传入的函数(只对函数或方法生效,代码块不生效),常 ...

  9. Go-关键字defer、panic、recover详解

    目录 defer 调用时机 多次调用时的执行顺序 传参问题 源代码 panic 执行defer 跨协程问题 源代码 recover 使用 源代码 总结 defer panic recover 全部源代 ...

最新文章

  1. 【文本分类】基于改进CHI和PCA的文本特征选择
  2. flutter 键盘遮挡输入框问题_flutter插件推荐之 keyboard_avoider - 解决输入时的键盘遮挡问题...
  3. python画直方图代码-用python绘制直方图
  4. mac 用户 文件夹 权限_这可能是 Mac 共享文件最详细的教程了
  5. Python 2.7 将于7个月后终结,这是你需要了解的3.X炫酷新特性
  6. python加权最小二乘_【Python】统计科学之加权最小二乘法
  7. 为什么element的el-backtop会不管用,来看这里!
  8. mvc框架upgrade
  9. php订单金额分摊算法,PHP付钱找钱算法
  10. linux中pstree命令的含义,pstree命令--Linux命令应用大词典729个命令解读
  11. vba excel 取得chart保存图片_保存Excel中的图片
  12. hdu 4351 Digital root
  13. mysql 一对多 join_mysql多表left join 1对多的解决办法
  14. 【ccpc网络赛】Tree and Permutation【1009】【树上+组合数学】
  15. 麦肯锡方法:解决问题的七个步骤
  16. 维普c语言代码查重原理,维普查重太假了?面对变态查重方式,如何修正才能通过考核?...
  17. python编程星期几_python如何获取星期几
  18. transition参数css,css3的transition属性详解
  19. mysql文件用什么打开_sql文件用什么打开?
  20. [Irving] Wpf DevexPress GridControl 获取选中行

热门文章

  1. ASP.NET MVC 实现多文件上传
  2. 2021牛客多校10 - Browser Games(哈希)
  3. 牛客多校3 - Operation Love(几何+叉积确定三点顺逆)
  4. java怎么把数据封进对象里_(Java)想把数组中一条一条的数据全部放入对象中去..要怎么做呢...
  5. Timus1286(欧几里德算法的应用)
  6. JSP中的include指令
  7. OD的 CC断点,内存访问断点,硬件断点 解析
  8. C++虚继承(八) --- 虚继承与继承的差异
  9. DDoS攻击原理及防护方法论
  10. sqlite的几个常用方法