go语言之异常捕获

1 什么是异常

不按照我们期望执行的都可以称之为异常

2 go语言中如何处理异常

一种是程序发生异常时, 将异常信息反馈给使用者

一种是程序发生异常时, 立刻退出终止程序继续运行

我们可以通过panic来抛出异常。

func t_defer3(){
print("t_defer3\n")
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\n")
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异常会随着函数的调用栈向外传递

  1. 例如: A函数调用了B函数, B函数调用了C函数
  2.  如果在C函数中抛出了一个panic异常, 那么这个异常会一层一层的传递到B和A
  3.  也就是在B和A函数中也能捕获到这个异常

比如下面的例子

func t_defer1(){
panic(123)
}


在main中也能捕获到t_defer1中的异常
func main(){
defer func() {
if err:=recover();err != nil{
fmt.Println(err)
}
}()
  t_defer1()
}

 

posted @ 2021-09-16 22:42  red_leaf_412  阅读(929)  评论(0编辑  收藏  举报