go语言没有使用像java python等语言的try catch/except 语句来处理异常,而是使用它特有的panic,recover,defer来捕获和处理异常
- defer 这个关键字修饰的语句不会立即执行,而是在函数执行完成将要退出前执行
- panic 用来抛出异常,类似于python的raise, 函数执行到这里后不再执行后面的语句,但函数退出前还是会执行defer修饰的语句
- recover是个内置函数,用来捕获异常,recover必须定义在defer语句后面
下面来看个例子
package main
import "fmt"
func main() {
c := divide(1, 0)
fmt.Println(c)
fmt.Println("execute completly")
}
func divide(a, b int) int {
defer func() {
err := recover()
if err != nil {
fmt.Println("error happen!")
fmt.Println(err)
} else {
fmt.Println("all right")
}
}() //匿名函数,这里必须要带上()
if b == 0 {
panic("divided by zero!!")
}
return a / b
}
//输出
error happen!
divided by zero!!
0
execute completly
分析:
divide是一个做除法的函数,可能会出现除数为0的错误,所以在函数一开头就定义了一个defer匿名函数(注意这里的匿名函数定义完后面要带上括号才能执行),这个匿名函数被defer修饰了所以只在divide函数执行完才会执行,而不是一进来就执行。后面判断b是否等于0,如果为零的话我们手动使用panic抛出了异常,这个异常是在divide函数退出前执行的defer匿名函数里通过recover()来捕获的,如果err不为空就说明发生了错误,打印error happen!和panic抛出的divided by zero!! 然后主协程返回到主函数main里,继续执行后面的打印