1. defer : 延迟调用。多个defer,依次入栈,在函数即将退出时,依次出栈调用

 package main
import "fmt"
func main() {
defer func() {
fmt.Println("defer one")  
}()
defer func() {
fmt.Println("defer two")   
}()
defer func() {
fmt.Println("defer three")  
}()
}

2. panic和defer结合使用:panic触发错误,defer依次出栈调用,没有recover捕获的情况下,最后才打印错误

 package main
import "fmt"
func main() {
defer func() {
fmt.Println("defer one")
}()
defer func() {
fmt.Println("defer two")
}()
defer func() {
fmt.Println("defer three")
}()
panic("panic here")
}

3. defer,panic, recover 结合使用,panic触发错误,defer依次出栈调用,直到被recover捕获,打印捕获的信息,之后继续defer出栈

例一:

 package main
import "fmt"
func main() {
defer func() {
fmt.Println("defer one")
}()
defer func() {
fmt.Println("defer two")
}()
defer func() {
if info := recover(); info != nil {
fmt.Println("catch: ", info)
}
fmt.Println("defer three")
}()
panic("panic here")
}

例二:

package main
import "fmt"
func main() {
defer func() {
fmt.Println("defer one")
}()
defer func() {
if info := recover(); info != nil {
fmt.Println("catch: ", info)
}
fmt.Println("defer two")
}()
defer func() {
fmt.Println("defer three")
}()
panic("panic here")
}

例三:

package main
import "fmt"
func main() {
defer func() {
if info := recover(); info != nil {
fmt.Println("catch: ", info)
}
fmt.Println("defer one")
}()
defer func() {
fmt.Println("defer two")
}()
defer func() {
fmt.Println("defer three")
}()
panic("panic here")
}

4. recover 必须在defer中调用,才有效,否则返回nil

package main
import "fmt"
func main() {
if info := recover(); info != nil {
fmt.Println("catch: ", info)
} else {
fmt.Println("recover return nil")
}
defer func() {
fmt.Println("defer one")
}()
defer func() {
fmt.Println("defer two")
}()
defer func() {
fmt.Println("defer three")
}()
panic("panic here")
}

5. panic 其后的代码不会执行

例一:

package main
import "fmt"
func main() {
defer func() {
fmt.Println("defer one")
}()
defer func() {
fmt.Println("defer two")
}()
defer func() {
fmt.Println("defer three")
}()
panic("panic here")
if info := recover(); info != nil {
fmt.Println("catch: ", info)
} else {
fmt.Println("recover return nil")
}
}

例二:

package main
import "fmt"
func main() {
defer func() {
fmt.Println("defer one")
}()
defer func() {
if v := recover(); v != nil {
fmt.Println("catch panic error: ", v)
}
fmt.Println("defer two")
}()
defer func() {
fmt.Println("defer three")
}()
panic("panic here")
fmt.Println("after panic")
}

defer, panic, recover使用总结的更多相关文章

  1. Go语言异常处理defer\panic\recover

    Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱.因为开发者很容易滥用异常, ...

  2. defer,panic,recover

    Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱.因为开发者很容易滥用异常,甚至一个小小的错误都抛出一个 ...

  3. Go的异常处理 defer, panic, recover

    Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱.因为开发者很容易滥用异常, ...

  4. go语言defer panic recover用法总结

    defer defer是go提供的一种资源处理的方式.defer的用法遵循3个原则 在defer表达式被运算的同时,defer函数的参数也会被运算.如下defer的表达式println运算的同时,其入 ...

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

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

  6. go panic recover 异常处理

    Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱.因为开发者很容易滥用异常, ...

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

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

  8. 15 Defer, Panic, and Recover

    Defer, Panic, and Recover 4 August 2010 Go has the usual mechanisms for control flow: if, for, switc ...

  9. 6.Go-错误,defer,panic和recover

    6.1.错误 Go语言中使用builtin包下error接口作为错误类型 Go语言中错误都作为方法/函数的返回值 自定义错误类型 //Learn_Go/main.go package main imp ...

随机推荐

  1. linux驱动之LED驱动_1

    步骤: 1.框架 2.完好硬件的操作: a.看原理图.引脚 b.看2440手冊 c.写代码: IO口须要用ioremap映射 我的板子电路例如以下所看到的 1.配置GPBCON 寄存器,配置输出   ...

  2. 【bzoj1015】[JSOI2008]星球大战starwar

    给定一个无向图,求联通块个数,以及k次每次摧毁一个点后的联通块个数 将边和摧毁的点全记录下来,反着做即可 注意被摧毁的点不能算作联通块 #include<algorithm> #inclu ...

  3. Linux 数据分析常用 shell命令

    .文件合并 目录下有成千上万的小文件,需合并成大文件,直接cat 返回参数列表过长 ls |xargs -t -I{} cat {} >> merge.txt 2.从文本中截取行特定内容 ...

  4. Android 信息提示——Toast方式

    Toast用于向用户显示一些帮助/提示.一下列举了5中样式. 一.默认的效果(显示在屏幕的底部) 代码: Toast.makeText(getApplicationContext(), "默 ...

  5. Olddriver’s books

    Olddriver 的书多的吓人,什么算法导论,组合数学英 文版(orz)......他把 n 本书都放在身后的桌子上, 每本书有一定的面积,并且书可以覆盖,求 n 本书覆盖桌面 的面积 输入格式: ...

  6. bzoj2752

    线段树+概率 今天这道题爆零了,奥妙重重. 其实我们可以把式子化成这样:sigma((i-l+1)*(r-i+1)*ai) 这里r减了1 然后展开,(1-l)*(r+1)*ai+(r+l)*i*ai- ...

  7. Hadoop - WordCount代码示例

    文章来源:http://www.itnose.net/detail/6197823.html import java.io.IOException; import java.util.Iterator ...

  8. nginx初相识

    在本机上下载了一个nginx,版本为1.14.0. 安装: 对于安装比较简单,下载后解压到指定目录,目录结构如下 启动: 最简单的直接双击nginx.exe,有黑窗一闪而过,不要怀疑,看一下logs的 ...

  9. E20170926-mk

    validation   n. 确认; proposal n. 建议; 提议; 求婚; 〈美〉投标; teaser   n. 戏弄者,喜欢戏弄别人的人; 棘手的问题; batch   n. 一批; 一 ...

  10. Kafka详解与总结(一)

    1. Kafka概述 1.1. 消息队列 1)点对点模式(一对一,消费者主动拉取数据,消息收到后消息清除) 点对点模型通常是一个基于拉取或者轮询的消息传送模型,这种模型从队列中请求信息,而不是将消息推 ...