请问如何recover一个for循环中的错误

来源:1-2 课程资源获取方式 - 非常重要!!!

kanokano

2020-11-12

如果一个for循环中有错误的话,在外层defer recover一次的话,虽然可以捕获一次错误,但是程序还是会被终止。如果在for循环内部循环一次就defer recover一次的话,连错误都捕获不到。请问老师出现这个情况的原因是什么?还有我要如何用recover配合for循环来使用,保证即使for循环内部错误不止一个,我也能全部捕获到,而且for循环还不能被终止,因为如果用for循环去遍历一个空接口的切片的话,是很有可能出现异常的,而且可能还会不止一次,但是我的程序又必须要执行完这个for循环。

写回答

1回答

bobby

2020-11-12

这样来理解把,你现在是写python代码,一个try except只能catch住你try里面的代码异常,而且你也得知道,如果你是try住的异常,是没有理由让他执行后面的逻辑的,异常本身的就没有捕获住之后还应该执行后续逻辑的道理,你说的能处理后续的逻辑是错误不是异常,我这里给你举例一段代码来说吧:

//img.mukewang.com/szimg/5fad2c3909b4ea3404210238.jpg

上这一行代码会出现异常,但是你会指望出现异常以后还能运行下一行代码吗?如果是这样你这就不叫异常,而是你能预见到可能会出现的错误,所以你会这样改

//img.mukewang.com/szimg/5fad2ca50935abb703080254.jpg

所以你应该想问题的是如果recover只捕获指定的代码,可以这样做:把for循环中的逻辑放入到一段函数中去执行然后在这个函数中去recover,参考下面的代码:

package main

import "fmt"
func main() {
   for i := 0;i<10; i++ {
      func() {
         defer func() {
            if err := recover(); err != nil { //产生了panic异常
               fmt.Println(err)
            }

         }() //别忘了(), 调用此匿名函数
         if i == 3 {
            d := make([]string, 0)
            fmt.Println(d[0])
         }else{
            fmt.Println(i)
         }
      }()

   }
}


0
0

Go+Python打造电商系统 自研微服务框架 抓紧高薪机遇

快速转型Go工程师,成为具备双语言后端能力的开发者

512 学习 · 532 问题

查看课程