2017-05-04 115 views
0

在代碼片段中首次執行循環期間,發生異常throws.my問題是如何在發生恐慌時繼續執行循環的下一次迭代。如在java中嘗試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 

     } 

} 
+0

1.執行不會在推遲執行後的循環。2.您需要設置至少10作爲片'arr'的容量 –

+2

恐慌**不是**例外。對於習慣於其他語言的程序員來說,這是一種常見的錯誤,但它根本不起作用!如果你在Go中有一個恐慌,那麼這通常意味着你犯了一個需要糾正的編程錯誤,而不是通過「捕捉」恐慌來「處理」(就像你在這裏所做的那樣)。 – Carpetsmoker

+0

我的問題是如何在發生恐慌時繼續執行循環的下一次迭代,謝謝。喜歡在java中嘗試catch機制,循環將繼續執行循環的下一次迭代。 – witrus

回答

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

+0

我的問題是如何在發生恐慌時繼續執行循環的下一次迭代,謝謝。喜歡在java中嘗試catch機制,循環將繼續執行循環的下一次迭代。 – witrus

+1

Go不是Java @witrus。它並不是真的有這樣的機制。處理這個問題的方法是確保恐慌不會發生,或者用這個答案中的建議,或者通過像'if i> len(arr){...}'這樣的東西守護這個任務。 – Carpetsmoker

0

你可以換一些FUNC內的所有工作,並要求推遲與恢復裏面

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) 
    } 
}