Golang异常处理之panic、recover、defer

Golang不是面向对象语言,也没有try ... catch... 或者 try ... exception... 结构。

Golang语言使用panic、recover,配合着defer,来完成类似功能。

defer本身用处很多,比如延后执行(函数结束时候才执行)。看个例子:

package main

import "fmt"

func main() {
	var i int
	defer fmt.Println("end")
	fmt.Println("begin: 0")
	i++
	fmt.Println(i)
}

//输出结果:
begin: 0
1
end

panic和recover的需要注意几点:

  1. defer 需要放在 panic 之前定义,另外recover只有在 defer 调用的函数中才有效
  2. recover处理异常后,逻辑并不会恢复到 panic 那个点去,函数跑到 defer 之后的那个点
  3. 多个 defer 会形成 defer 栈,后定义的 defer 语句会被最先调用

看个例子:

package main

import (
	"fmt"
	"time"
)

func main() {
	f()
	fmt.Println("end")
}

func f() {
	defer func() {
		fmt.Println("start defer part")
		if err := recover(); err != nil {
			fmt.Println("err: ",err)
			}
		fmt.Println("end defer part")
		}()
	for {
		fmt.Println("func begins")
		a := []int{1,2}
		fmt.Println(a[3])
		panic("bug occurs")
		fmt.Println("func ends")
		time.Sleep(1 * time.Second)
		}
}

//执行结果:
func begins
start defer part
err:  runtime error: index out of range
end defer part
end

程序执行结果,貌似往panic里面扔什么字符串都没关系... 反正没被引出来。
不管前面错不错,它就是强行触发,执行退出(defer操作... )... 

具体错误信息,从recover()里面读出来。如果没出错,则不读出... 

当前理解如此,后面如有新体会,则续写本帖。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值