2017-05-04 42 views
0

コードスニペットでループを最初に実行しているときに、例外throws.myの問題は、パニックが発生したときにループの次の繰り返しを実行する方法です。ループの次の繰り返しの実行を続けます。例外が発生したときにループを実行し続ける

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.実行は文句を言わない延期実行後のループになるの内側に回復して延期一部FUNC内のすべての作業をラップし、呼び出すことができます。2.あなたが設定する必要があります少なくともスライス 'arr'の容量として10。 –

+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

あなたはそれが

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) 
    } 
} 
関連する問題