浅谈defer、panic、recover 三者的用法
【摘要】 1 Go的异常处理机制的引入go的异常是一个interface类型type error interface { Error() string}并且是可输出的func methodA() { var err error fmt.Println(err)}func main() { methodA()}但是我们一般用panic函数进行捕获func methodA() { v...
1 Go的异常处理机制的引入
go的异常是一个interface类型
type error interface {
Error() string
}
并且是可输出的
func methodA() {
var err error
fmt.Println(err)
}
func main() {
methodA()
}
但是我们一般用panic函数进行捕获
func methodA() {
var err error
fmt.Println(err)
panic(err)
fmt.Println(err)
}
func main() {
methodA()
}
这样的做法就会导致一个问题,那就是程序崩溃,不能向下进行继续的处理和异常的返回,因此我们必须有一个良好的异常处理机制进行对error类型的合理输出和处理。
由此,我们引入了defer+panic+recover进行Go程序异常处理
2 defer用法
defer函数类似于一个栈,常用于对流操作的close操作,具体演示下就知道了:
func def() {
a := func() {
fmt.Println("A")
}
b := func() {
fmt.Println("B")
}
c := func() {
fmt.Println("C")
}
defer c()
defer b()
defer a()
}
func main() {
def()
}
执行结果:
3 panic和recover用法
为什么将这两个函数放在一起说呢,因为他们两个就相当于Java中的throw和try{...}catch{...}
联合进行异常的捕获和处理,示例:
func a() {
defer func() {
r := recover()
fmt.Println("panic recover", r)
}()
panic(1)
}
func main() {
defer func() {
r := recover()
fmt.Println("main recover", r)
}()
a()
fmt.Println("main")
def()
}
4 总结
- defer:异常时函数结束返回
- panic:自定义抛出异常
- recover:获取并输出异常
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)