请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

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

正在回答

1回答

bobby 2020-11-12 20:56:33

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

https://img1.sycdn.imooc.com//szimg/5fad2c3909b4ea3404210238.jpg

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

https://img1.sycdn.imooc.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 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信