英文:
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 (
"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
}
}
答案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)
答案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 (
"fmt"
)
func doSmth(arr []int, idx int) {
defer func() {
if err := recover(); err != nil {
fmt.Printf("error is %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)
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论