首页 > 其他分享 >recover和panic的使用注意事项

recover和panic的使用注意事项

时间:2022-10-08 10:36:48浏览次数:40  
标签:defer fmt func 注意事项 Println recover panic

panic & recover 作用范围的:

  • recover 只有在 defer 中调用才会生效;
  • panic 允许在 defer 中嵌套多次调用;
  • panic 只会对当前 Goroutine 的 defer 有效

恢复异常代码

defer func() {
  if err := recover(); err !=nil{
   fmt.Println(err)
  }
 }()

runtime 中有哪些坑?

panic 我们在实现业务的时候是不推荐使用的,但是并不代表 runtime 里面不会用到,对于不了解 Go 底层实现的新人来说,这无疑是挖了一堆深坑。如果不熟悉这些坑,是不可能写出健壮的 Go 代码。

下面我将 runtime 中的异常分一下类,有一些异常是 recover 也捕获不到的,有一些是正常的 panic 可以被捕获到。

无法捕获的异常

内存溢出

func main() {
 defer errorHandler()
 _ = make([]int64, 1<<40)
 fmt.Println("can recover")
}

func errorHandler() {
 if r := recover(); r != nil {
  fmt.Println(r)
 }
}

map 并发读写

func main() {
 defer errorHandler()
 m := map[string]int{}

 go func() {
  for {
   m["x"] = 1
  }
 }()
 for {
  _ = m["x"]
 }
}

func errorHandler() {
 if r := recover(); r != nil {
  fmt.Println(r)
 }
}

能够被捕获的异常

数组 ( slice ) 下标越界

func foo(){
 defer func() {
  if r := recover(); r != nil {
   fmt.Println(r)
  }
 }()
 var bar = []int{1}
 fmt.Println(bar[1])
}

func main(){ 
 foo()
 fmt.Println("exit")
}

空指针异常

func foo(){
 defer func() {
  if r := recover(); r != nil {
   fmt.Println(r)
  }
 }()
 var bar *int
 fmt.Println(*bar)
}

func main(){
 foo()
 fmt.Println("exit")
}

 

标签:defer,fmt,func,注意事项,Println,recover,panic
From: https://www.cnblogs.com/chb39335580/p/16768121.html

相关文章

  • 前端程序员学习 Golang gin 框架实战笔记之三 panic 和 recovery
    上一节:前端程序员学习Golanggin框架实战笔记之二分析context1.Logger我把上一节main.go的代码换了:gin.New()换成了gin.Default()上一节我们说过,Default多了......
  • STL容器vector应用注意事项
      【1】提前分配足够空间以免不必要的重新分配和复制代价 同样是push_back操作,预分配足够空间和不分配空间的时间代价显而易见。【2】使用shrink_to_fit()释放vector占用的......
  • 「CF1710D」Recover the Tree
    题目给定一个\(n\timesn\)的01矩阵(的上三角部分)\(A_{n\timesn}\)。构造一棵有\(n\)个结点的树,满足:对于任意的\(1\lel\ler\len\),编号在\([l,r]\)内的结点......
  • where写布尔表达式的注意事项
    找出与“Smith”居住在同一城市、同一街道的所有客户的名字。--正确SELECT customer_nameFROM customerWHERE Customer_streetIN(SELECTCustomer_......
  • 关于@Scheduled注意事项
    在实际开发中由于项目部署在分布式或集群服务器上,会导致定时任务多次触发。定时任务执行默认是单线程模式,会创建一个本地线程池,线程池大小为1。当项目中有多个定时任务时......
  • 0067-Tui-panic 处理
    环境Time2022-08-17Rust1.63.0Tui0.18.0前言说明参考:https://github.com/fdehau/tui-rs/blob/master/examples/panic.rs目标使用tui-rs定义一个panichook......
  • 算法题注意事项/debug细节(Java语言)
    注意循环中的序号使用:i,j,k。看清现在在哪一层,要用哪个,不要用错。注意Java中的方法是都是值传递(pass-by-value),没有引用传递。对于对象是地址的值传递不要在循环中反......
  • 归并排序(merge sort):细节,注意事项
    如果在某一个程序中要多次使用归并排序,最好将在排序中要使用的tmp数组定义在排序函数之外,将tmp作为归并排序方法的一个参数,而不是在归并排序中每次新定义一个tmp数组,因......
  • 单链表注意事项
    经常采用的方法有头插法、尾插法、逆置法、归并法、双指针法等,对具体问题需要灵活变通;对于顺序表,由于可以直接存取,经常结合排序和查找的几种算法设计思路进行设计,如归并排......
  • mayfly-go管理工具注意事项!!
    Mayfly-GO部署操作指南开发指南前端后端其他......