2016-10-11 2 views
3

나는 생성자를 생성하기 위해 함수 f을 사용하지만 때때로 오류가 발생할 수 있습니다. 나는 현실에서 (오류를 생성하는 인덱스를 인쇄,yield 조합을 제외한 파이썬 시도

  1. 주요 블록의 for 루프가 except에서 오류
  2. 잡는 후 계속 주요 코드를 발생하는 두 가지 일을하고자하는 오류 수도 인덱스 3에 대해 발생하지 않음)

오류 발생 후 중단 된 코드가 중지되었습니다. 앞서 언급 한 두 가지 기능을 어떻게 구현해야합니까? 많은 감사합니다.

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

제네레이터 내부에서 예외가 발생하는 경우 물론 제네레이터 자체에서 예외를 catch하지 않는 한 해당 제너레이터의 실행을 다시 시작할 방법이 없습니다. – vaultah

+1

iterator 안의'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)) 

이 제공 :

>>> for i in f(10): 
...  print (i) 
... 
0 
1 
2 
Error with key: 3 
4 
5 
6 
7 
8 
9 
2

영업 해명의, 그는 내부 오류의 경우 루프의 외부 주를 계속하고 싶어 여기에 동작하는 예제입니다 생성자는 오류가 발생한 색인을 표시합니다.

brianpck의 답변은 오류를 인쇄 할 수 있도록 발전기를 수정하는 방법을 취합니다. 이렇게하면 주 루프는 해당 인덱스에서 발생한 오류를 알 수 없으므로 오류 다음의 결과를 인덱스 x-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-tuple)의 부울 값을 포함하는 또 다른 방법이 있습니다.

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 
관련 문제