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 ...
随机推荐
- LeetCode 443. String Compression (压缩字符串)
题目标签:String 这一题需要3个pointers: anchor:标记下一个需要存入的char read:找到下一个不同的char write:标记需要存入的位置 让 read指针 去找到下一个 ...
- oninput 中文输入
使用 input 监听 input 中文输入,会被每次输入的字母打断,下面就解决这个问题 $('input') .off() .on('input',function(){ if($(this).pr ...
- Linux 下查找文件或文件夹
有些在我看来比较实用的命令,在这里记一下,避免每次都搜索一轮. 1.查找文件和文件夹 $ find . -name "mongo*" 从当前路径开始,向子目录查找名字含有 &quo ...
- P1830 轰炸III
P1830 轰炸III 84通过 145提交 题目提供者wanglichao1121 标签模拟矩阵洛谷原创 难度普及/提高- 提交该题 讨论 题解 记录 最新讨论 暂时没有讨论 题目背景 一个大小为N ...
- Window attributes属性详解
以下属性以Dialog为例来讲解: <item name="windowBackground"> 窗体的背景 </item><item name=&q ...
- bzoj1008 [HNOI2008]越狱——快速幂
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1008 (这样一道水题还因为忘记写 %lld WA了那么多遍) 发生越狱的状态数,就是全部状态 ...
- [Swift通天遁地]四、网络和线程-(5)解析网络请求数据:String(字符串)、Data(二进制数据)和JSON数据
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- 能力 or say 职业 规划
2019.5.8 黑盒测试,白盒测试,接口测试,自动化测试,性能测试.. 往测试工程师发展,再是测试开发,高级测试开发.. 要是真的喜欢前端,可以再转吧.前端后端应该要清楚它们的区别 前端:广度, ...
- ios TextField 不被键盘遮住
首先放一个scrollView窗口,将Scroll View视图占整个屏幕. 向Scroll View 添加TextField 控件. 首先,ViewController.h 代码如下; #i ...
- 【Java基础】多态
首先先来个总结: 什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消 ...