2016-10-11 23 views
3

私は関数fを使ってジェネレータを作成しますが、エラーが発生することがあります。私は実際に(エラーが発生したインデックスをプリントアウトし、python試し利回りを試してみてください

  1. メインブロック内forループがexceptでエラー
  2. をキャッチした後、続けてメインコードのために起こる2つのものをご希望のエラーかもしれませんインデックス3には発生しません)

エラーが発生した後、私が立ち上がったコードは停止します。前述の2つの機能をどのように実装しますか?どうもありがとう。

def f(n): 
    for i in xrange(n): 
     if i == 3: 
      raise ValueError('hit 3') 
     yield i 

if __name__ == '__main__': 
    a = enumerate(f(10)) 
    try: 
     for i, x in a: 
      print i, x 
    except ValueError: 
     print 'you have a problem with index x' 
+3

例外がジェネレータ内で発生した場合、ジェネレータ自体の内部で例外をキャッチしない限り、ジェネレータの実行を再開することはできません。 – vaultah

+1

イテレータの中の 'for 'または' main'の中の 'for'を続けたいのかどうかは分かりません.... –

+0

メインブロックの' for'を続行します。元の投稿が編集されました。 – nos

答えて

4

あなたはそのループが実行を継続したい場合はあなたの発電機の内部で例外をキャッチする必要があります。ここでは実施例である:あなたの例のように、それを反復

def f(n): 
    for i in xrange(n): 
     try: 
      if i == 3: 
       raise ValueError('hit 3') 
      yield i 
     except ValueError: 
      print ("Error with key: {}".format(i)) 

が与える:

OPの明確化のよう
>>> for i in f(10): 
...  print (i) 
... 
0 
1 
2 
Error with key: 3 
4 
5 
6 
7 
8 
9 
2

、彼は内部エラーが発生した場合には、forループ外の主を続けたいですどのインデックスにエラーが発生したかを示すジェネレータ。

brianpckの回答は、エラーを出力するようにジェネレータを変更するアプローチをとります。このようにして、メインループはそのインデックスで発生したエラーを認識しないため、エラーの後の結果をインデックスx-1に格納します。時にはあなたは "1つのインデックス< - > 1つの結果"という仮定を気にします。

これを解決するには、エラーを生成してからジェネレータで何をするかを決めることで、手動でエラーを管理できます。次のよう

def f(n): 
    for i in xrange(n): 
     if i == 3: 
      yield ValueError('hit 3') 
      continue # or break, depends on problem logic 
     yield i 

if __name__ == '__main__': 
    a = enumerate(f(10)) 
    for i, x in a: 
     if isinstance(x, ValueError): 
      print "Error at index", i 
      continue 

     print i, x 

は、通常は非常に低いですジェネレータは、例外クラスを得ているので、結果は例外とそれを扱っているかどうかはチェックしても安全でしょう。

1

一般に、エラー状態になる値をキャッチしたいと思っています。発電機の内部でループを停止することなく。ここでは、計算が正常に完了できるかどうかを示すジェネレータの結果にブール値(2タプルとして)を含む別の方法があります。

def f(n): 
    for i in range(n): 
     accept=True 
     try: 
      result=1/(3-i) 
     except: 
      accept=False 
     yield accept, i 

a=enumerate(f(10)) 
for k,(ok,i) in a: 
    print (ok,i) 

この場合、値3のみが失敗します。ここに出力があります。

True 0 
True 1 
True 2 
False 3 
True 4 
True 5 
True 6 
True 7 
True 8 
True 9 
関連する問題