2012-12-05 2 views
1

하나 이상의 반복에서 예외가 발생할 수있는 루프가 있습니다. 루프가 완료되기를 원한다면, 다음 예제에서 "raise on 4"에서 발생한 첫 번째 예외가 발생합니다.루프 완료 후 for 루프에서 발생한 첫 번째 예외 발생

예제 코드 :

e = None 
for x in range(10): 
    try: 
     print x 
     if x == 4: 
      raise Exception('raise on 4') 
     if x == 6: 
      raise Exception('raise on 6') 
    except Exception as e: 
     print e 
     continue 
else: 
    if e: 
     raise 

출력 :

0 
1 
2 
3 
4 
raise on 4 
5 
6 
raise on 6 
7 
8 
9 
Traceback (most recent call last): 
    File "<stdin>", line 7, in <module> 
Exception: raise on 6 

내가 잘되는을 기록 할 로깅 모듈을 사용할 수 있지만 가능하면 첫 번째 예외에 제기하고 싶습니다.

저는 아직 "Python"에 대해 상당히 익숙하지 않기 때문에 "else"문으로 루프를 구성한 방식이 매우 파이썬 적이거나 정확하면 완전히 확신 할 수 없습니다.

+0

'오류 = 없음 .... 예외를 제외하고 전자 같이하지 않을 경우 오류 : 오류 = 전자 ... 경우 오류 : 오류 발생 '. – khachik

+0

또한,'for' 루프에'break'가 없으므로'for' 다음에'else'가 필요 없습니다. 'else'는 루프 조건이 고갈 될 때 실행되고'break '를 사용하여 루프가 끝났을 때 실행되지 않습니다. 그래서 당신의 경우'else'는 완전히 쓸모가 없습니다. – khachik

답변

2

은 별도의 변수에 e을 저장할 수 있습니다 예외가 처음 발생할 때

firste = None 
for x in range(10): 
    try: 
     print x 
     if x == 4: 
      raise Exception('raise on 4') 
     if x == 6: 
      raise Exception('raise on 6') 
    except Exception as e: 
     if firste is None: 
      firste = e 
     continue 

if firste is not None: 
    raise firste 

지금 firste 만 설정됩니다.

이 경우 else을 사용할 필요가 없습니다. for 루프에 else 제품군을 건너 뛰는 break 문이 포함 된 경우에만 사용하십시오. 그렇지 않으면 else 스위트 들여 쓰기를 사용하지 않고 루프 아래 firste에 대한 테스트를 수행하십시오.

+0

감사합니다. khachik의 코멘트에서 슬림화 된 버전을 사용했지만, 당신의 생각은 "없음", "없음"이 아니라는 것을 이해하는 데 도움이되었습니다. – jelloir

0

당신은 목록에 오류를 추가 할 수 있으며, 나중에 제기하지 :

In [25]: errors=[] 

In [26]: for x in range(10): 
     try: 
       print x 
       if x == 4: 
         raise Exception('raise on 4') 
       if x == 6: 
         raise Exception('raise on 6') 
     except Exception as e: 
        errors.append(e) 
        continue 
    ....:    
0 
1 
2 
3 
4 
5 
6 
7 
8 
9 

In [27]: for error in errors: 
    raise error 
    ....: 
--------------------------------------------------------------------------- 
Exception         Traceback (most recent call last) 
<ipython-input-27-1f1d8ab5ba84> in <module>() 
     1 for error in errors: 
----> 2  raise error 

Exception: raise on 4 
+0

이 코드의 문제점은 오류의 첫 번째 오류 만 발생시키고 실행이 중지됩니다 (오류 발생시 다음 오류를 발생시킬 기회가 없음) –

관련 문제