golang中的defer-recover-panic

panic

panic其实就是我们其他语言中的throw exception

recover

recover其实就是其他语言的try catch

注意

  1. recover如果想起作用的话, 必须在defered函数中使用。
  2. 在正常函数执行过程中,调用recover没有任何作用, 他会返回nil。如这样:fmt.Println(recover()) 。
  3. 如果当前的goroutine panic了,那么recover将会捕获这个panic的值,并且让程序正常执行下去。不会让程序crash。

总结

总结

  1. 先执行return再执行defer
  2. 如果触发多个panic,后触发的Panic会覆盖前面的Panic
  3. defer-recover必须写在panic前面,因为发生panic后将不会执行位于panic后面的代码,如果在Panic之前有的defer代码将会按序执行
  4. 如果当前函数触发了panic之后没有进行defer-recover,此时这个panic(会带着自己的异常去找对应的defer-recover)将会传回到上一级,如果上一级的defer链也没有对应的defer-recover将会一直返回到main,造成整个程序crash。如果不想影响函数的主流程,需要在对应的函数panic前面加上defer-recover
  5. 协程遇到panic之后,将会遍历本协程的defer链表,并执行对应的defer,执行defer过程中,遇到recover就停止panic,返回recover处继续执行,如果没有遇到recover,遍历完本协程的defer链表,(将会沿着调用链返回上一级继续执行上一级的defer链表直到异常捕获或到main之后crash)或者如果没有上一级就会抛出错误信息,
go