2016-08-25 1 views
2

그래서 예외를 다시 발생시키기 위해 다음을 사용하는 것에 대해 언급했습니다.예외를 다시 제기하는 시점은 무엇입니까?

try: 
    whatever() 
except: 
    raise 

예외를 다시 제기하는 목적은 무엇입니까? 분명히 잡히지 않는 예외가 어쨌든 맨 위로 올라갈 것입니까? 즉 :

int("bad") 

즉 I 콘솔에 ValueError를 얻을 :

try: 
    int("bad") 
except: 
    raise 

가 동일한 출력을 갖는다.

+1

이 유용 - 예를 추가 디버깅 정보를 인쇄하거나 일반적으로 당신이 * *을 예외를 다시 제기하지 않는 게 좋을 파일 – muddyfish

+3

을 청소. –

답변

1

다음 코드를 상상해보십시오.

약간의 설정 : 예를 들어 방대한 정보 데이터베이스를 유지 관리해야하며 데이터가 손실되는 것은 치명적인 일입니다! 다른 물건을 할 때

huge_dictionary = {'lots_of_important':['stuffs']} 
try: 
    check_data(new_data) #make sure the data is in the correct format 
    huge_dictionary['lots_of_important'].append(new_data) 
except: 
    data_writer.backup(huge_dictionary) 
    data_writer.close() 
    #and any other last second changes 
    raise 
3

예제 코드는 무의미하지만 실패한 경우에만 발생하는 로깅이나 정리를 수행하려는 경우 except:raise 사이에 넣을 수 있습니다. 그런 다음 원래 예외 정상적으로 버블 링하고 있었다.

+0

좋아요, 그렇기 때문에 하위 함수에서 발생한 예외를 취해서 응용 프로그램에서 더 높은 값을 지정하면 try/except를 사용하지 않아도됩니다. –

+1

@DavidBoard : 예. 오류 코드 반환에 대한 예외의 주요 장점. 주어진 예외에 대해 이해할 수없고 아무 것도 할 수없는 함수는 코드를 작성하지 않아도 처리 할 수있는 사람을 찾을 때까지 끊김없이 거품을냅니다. – ShadowRanger

+0

이것은 진짜 대답입니다. 'except : raise' (다른 코드 없음)는 무의미합니다. 그러나 나는 그것을 실제로 만난다. 진정한 실패 지점을 모호하게 만든다. 파이썬의 예외적 인 선종의 효과가있는 것 같습니다. – semiomant

관련 문제