Golang中的panic和recover用法
golang中的panic用于异常处理,个人感觉没有try catch finally方式直观和易用。
func panic(v interface{})
函数的作用为抛出一个错误信息,同时函数的执行流程会结束,但panic之前的defer语句会执行,之后该goroutine会立即停止执行,进而当前进程会退出执行。
func recover() interface{}
定义在panic之前的defer语句中,用于将panic()进行捕获,这样触发panic时,当前gotoutine不会被退出。
recover所返回的内容为panic的函数参数,如果没有捕获到panic,则返回nil。
注意:recover仅能定义在defer中使用,在普通语句中无法捕获recover异常。recover可以不跟panic定义在同一个函数中使用。
example 1
1 | import "fmt" |
panic()执行后,会先调用defer函数,然后打印panic: 3
,当前goroutine退出,后续语句不再执行,程序输出:
1 | 2 |
example 2
1 | package main |
在执行panic后,触发当前函数中的defer中的recover函数,此时panic后的当前函数中的语句同样是不再执行,但当前goroutine不会退出。也就是说panic被recover后,会影响到当前函数中的后续语句的执行,但不影响当前goroutine的继续执行,输出内容如下:
1 | 2 |
example 3
1 | package main |
recover跟panic定义在不同的函数中,仍然可以发挥作用。
1 | 1 |