defer, panic, recover使用总结
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使用总结的更多相关文章
- Go语言异常处理defer\panic\recover
Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱.因为开发者很容易滥用异常, ...
- defer,panic,recover
Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱.因为开发者很容易滥用异常,甚至一个小小的错误都抛出一个 ...
- Go的异常处理 defer, panic, recover
Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱.因为开发者很容易滥用异常, ...
- go语言defer panic recover用法总结
defer defer是go提供的一种资源处理的方式.defer的用法遵循3个原则 在defer表达式被运算的同时,defer函数的参数也会被运算.如下defer的表达式println运算的同时,其入 ...
- Golang 入门系列(十四)defer, panic和recover用法
以前讲过golang 的基本语法.但是,只是讲了一些基础的语法,感兴趣的可以看看以前的文章,https://www.cnblogs.com/zhangweizhong/category/1275863 ...
- go panic recover 异常处理
Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱.因为开发者很容易滥用异常, ...
- GOLANG错误处理最佳方案errors wrap, Defer, Panic, and Recover
Simple error handling primitives: https://github.com/pkg/errors Defer, Panic, and Recover: ...
- 15 Defer, Panic, and Recover
Defer, Panic, and Recover 4 August 2010 Go has the usual mechanisms for control flow: if, for, switc ...
- 6.Go-错误,defer,panic和recover
6.1.错误 Go语言中使用builtin包下error接口作为错误类型 Go语言中错误都作为方法/函数的返回值 自定义错误类型 //Learn_Go/main.go package main imp ...
随机推荐
- Android数据存储之IO
Android开发中免不了数据本地的存储,今天我们来说一说怎样利用IO流来进行数据存储. 这里我们通过模拟一个QQ登陆界面的小demo来实际操作IO流. 功能描写叙述:点击button能够保存用户输入 ...
- Android 驱动 (一) GPIO
前面的博文对Lichee做了系列分析,事实上就是对在<七年之痒>中所说的,Android BSP具备的一项基本素养-SHELL脚本,所以我们Lichee系列的文章着重分析了SHELL脚本和 ...
- 移植linux3.7到nuc900系列开发板遇到的问题
通过移植学习linux新版本内核,大概了解一下内核变化. 记录一下移植过程中遇到的问题或值得注意的地方. 1,添加一款arm9芯片的支持 首先修改\arch\arm\tools\mach-types文 ...
- YTU 2795: 编程题AB-侦察员的密码
2795: 编程题AB-侦察员的密码 时间限制: 1 Sec 内存限制: 128 MB 提交: 155 解决: 43 题目描述 侦察员小甲在被捕前在墙上写了两行文字(ASCII字符),其中包含了他 ...
- POJ 1663:Number Steps
Number Steps Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 13758 Accepted: 7430 Des ...
- FormatString格式大众人全
FormatString格式大众人全 Posted on 2010-08-12 16:14 moss_tan_jun 阅读(457) 评论(0) 编辑 收藏 格式化日期和数字的字符串经常要用到这个, ...
- go语言笔记——多值函数,本质上和nodejs的回调很像,不过nodejs是回调的第一个参数是err,而golang里是第二个!
5.2 测试多返回值函数的错误 Go 语言的函数经常使用两个返回值来表示执行是否成功:返回某个值以及 true 表示成功:返回零值(或 nil)和 false 表示失败(第 4.4 节).当不使用 t ...
- oracle 分页方法
我分享两种: 1.用rownum select * from (select p.* , rownum rn from t_premium p where rn<= page * 10) a ...
- gulp的使用安装
gulp安装:用cnpm的时候把npm换成cnpm就好了. npm install -g gulp(全局安装,安装一次就好) npm install --save-dev gulp(安装到项目目录下, ...
- AcWing算法基础1.3
二分 二分分为整数二分和实数二分,其中整数二分模板有两个 模板: 整数二分模板 第一种模板将区间分为[ l , mid ] 和 [ mid + 1, r ] int bsearch_1(int l, ...