1 什么是异常
不按照我们期望执行的都可以称之为异常
2 go语言中如何处理异常
一种是程序发生异常时, 将异常信息反馈给使用者
一种是程序发生异常时, 立刻退出终止程序继续运行
我们可以通过panic来抛出异常。
func t_defer3(){
print("t_defer3 ")
panic("t_defer3_error")
}
func main(){
t_defer3()
print("test end")
}
执行结果:
t_defer3
panic: t_defer3_error
goroutine 1 [running]:
main.t_defer3()
D:/go_prj/src/test.go:46 +0x63
main.main()
D:/go_prj/src/test.go:50 +0x29
但是发现在panic发生的时候,整个goroutine都退出了。比如最后的test end就没有被执行。我们既想抛出异常,又想让进程继续运行,那就只能去捕获异常。捕获异常就要用到recover
func t_defer1(){
defer func() {
if r:=recover();r!=nil{
print("error found ")
fmt.Println(r)
}
}()
panic(123)
}
func main(){
t_defer1()
print("test end")
}
执行结果
123
error found
test end
异常有几个注意点:
1 同一个函数中, 多个panic异常, 只有第一个会被捕获
2 defer和recover必须在panic抛出异常之前定义。如果defer和recover在panic后定义,则异常不能被捕获到
3 panic异常会随着函数的调用栈向外传递
-
例如: A函数调用了B函数, B函数调用了C函数
-
如果在C函数中抛出了一个panic异常, 那么这个异常会一层一层的传递到B和A
-
也就是在B和A函数中也能捕获到这个异常
比如下面的例子
func t_defer1(){
panic(123)
}
在main中也能捕获到t_defer1中的异常
func main(){
defer func() {
if err:=recover();err != nil{
fmt.Println(err)
}
}()
t_defer1()
}