当异常发生时继续执行循环。

huangapple go评论85阅读模式
英文:

continue executing loop when exception happens

问题

在代码片段的第一次循环执行期间,抛出了一个异常。我的问题是,在发生异常时如何继续执行下一次循环的迭代。就像Java中的try-catch机制一样,循环将继续执行下一次循环的迭代。

package main

import (
	"fmt"
)

func main() {
	var arr []int = []int{5, 6, 7, 8, 9}
	fmt.Println(arr)
	for i := 6; i < 10; i++ {
		defer func() {
			fmt.Println("aaa")
			if err := recover(); err != nil {
				fmt.Printf("error is %v\n", err)
			}
		}()
		arr[i] = i
	}
}

在Go语言中,可以使用defer和recover来处理异常并继续执行下一次循环迭代。defer关键字用于延迟执行函数,而recover函数用于捕获并处理异常。在每次循环迭代中,使用defer定义一个匿名函数,在函数中进行异常处理。如果发生异常,recover函数将返回异常信息,然后可以在if语句中对异常进行处理。无论是否发生异常,defer函数都会被执行,确保异常处理代码的执行。

英文:

During first execution of the loop in the code snippet,an exception throws.my question is how to continue executing next iteration of the loop when panic happens.like try catch mechanism in java,the loop will continue executing next iteration of the loop.

package main

import (
        &quot;fmt&quot;
)

func main() {
        var arr []int = []int{5, 6, 7, 8, 9}
        fmt.Println(arr)
        for i := 6; i &lt; 10; i++ {
                defer func() {
                        fmt.Println(&quot;aaa&quot;)
                        if err := recover(); err != nil {
                                fmt.Printf(&quot;error is %v\n&quot;, err)
                        }
                }()
                arr[i] = i

        }

}

答案1

得分: 4

问题在于你的切片的长度和容量都是5,

https://play.golang.org/p/7wy91PTPum

而你正试图将某个元素添加到第6个位置。

你需要设置一个固定的大小,以确保它能容纳你想要放入其中的所有内容:

var arr [10]int = [10]int{5, 6, 7, 8, 9}

https://play.golang.org/p/GSNDXGt1Jp

或者使用append函数,并将

arr[i] = i

改为

arr = append(arr, i)

https://play.golang.org/p/kHNsFpcjVx

英文:

The issue is that your slice has a length and capacity of 5,

https://play.golang.org/p/7wy91PTPum

and you are trying to add something to the 6th position.

You need to either set a fixed size that you know will hold everything you want to put into it:

var arr [10]int = [10]int{5, 6, 7, 8, 9}

https://play.golang.org/p/GSNDXGt1Jp

Or use append and change

arr[i] = i

to

arr = append(arr, i)

https://play.golang.org/p/kHNsFpcjVx

答案2

得分: 1

你可以将所有的工作都包装在一个函数中,并在其中使用defer和recover。

package main

import (
    "fmt"
)

func doSmth(arr []int, idx int) {
    defer func() {
        if err := recover(); err != nil {
            fmt.Printf("错误:%v\n", err)
        }
    }()
    arr[idx] = idx
}

func main() {
    var arr []int = []int{5, 6, 7, 8, 9}
    fmt.Println(arr)
    for i := 6; i < 10; i++ {
        doSmth(arr, i)
    }
}

这段代码将数组arr中索引为idx的元素赋值为idx。如果出现错误,使用defer和recover来捕获错误并打印错误信息。

英文:

You could wrap all work inside some func, and call defer with recover inside it

package main

import (
        &quot;fmt&quot;
)

func doSmth(arr []int, idx int) {
    defer func() {
        if err := recover(); err != nil {
            fmt.Printf(&quot;error is %v\n&quot;, err)
        }
    }()
    arr[idx] = idx
}

func main() {
    var arr []int = []int{5, 6, 7, 8, 9}
    fmt.Println(arr)
    for i := 6; i &lt; 10; i++ {
        doSmth(arr, i)
    }
}

huangapple
  • 本文由 发表于 2017年5月5日 00:22:13
  • 转载请务必保留本文链接:https://go.coder-hub.com/43788187.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定