2010-01-21 2 views
11

일부 로깅을 수행하려는 Python except 절에 일부 코드가 있지만 로깅 코드 자체가 예외를 유발할 수 있습니다. 내 경우에는 발생할 수있는 두 번째 예외를 무시하고 원래의 예외를 발생시킵니다. 여기에 매우 단순화 된 예입니다 위의 코드를 실행except 절 내에서 발생하는 Python 예외 처리

try: 
    a = this_variable_doesnt_exist 
except: 
    try: 
     1/0 
    except: 
     pass 
    raise 

, 내가 얻을 수 있도록 노력하겠습니다 :

NameError: name 'this_variable_doesnt_exist' is not defined 

을 대신, 파이썬 2.x에서, 나는 얻을 :

ZeroDivisionError: integer division or modulo by zero 

나는 파이썬 3.x에서 내가 원하는 것을 수행한다는 것을 발견했다.

Python 2.x 문서에서이 부분에 대한 주석을 많이 찾을 수 없습니다 (놓치지 않았다면). 2.x에서 이것을 얻을 수 있습니까? 추상화

답변

15

:

def log_it(): 
    try: 
     1/0 
    except: 
     pass 

try: 
    this = that 
except: 
    log_it() 
    raise 

는 파이썬 2.5

이 변수에 예외를 저장하는 것입니다 할 수있는 또 다른 방법으로 원하는 것을 다음 명시 적으로 다시 상승 :

try: 
    this = that 
except NameError, e: # or NameError as e for Python 2.6 
    try: 
     1/0 
    except: 
     pass 
    raise e 

올 수있는 모든 것을 잡기 위해 노출 된 except 만 사용하면 안됩니다. 일반적으로 예상되는 특정 예외를 잡는 것이 가장 좋습니다 (메모리 부족과 같은) 치명적인 치명적인 예외가 발생할 경우에 발생합니다.

18

나는 당신이보고있는 것이 인 결과가 change in Python 3이라고 생각합니다. PEP에의 동기 섹션에서

:

한가지 예외 (예외 A)의 취급 중에, 다른 예외 (예외 B)이 발생할 수있다. 오늘날의 Python (버전 2.4)에서는 이런 경우 예외 B이 외부로 전파되고 예외 A이 손실됩니다. 문제를 디버그하려면 두 예외에 대해 모두 알아야합니다. __context__ 속성은이 정보를 자동으로 보유합니다.

PEP의는 다음 재미있는 읽기의 세부 —에 (Py3k에서 구현) 새로운 예외 체인을 설명하기 위해 계속된다. 나는 오늘 새로운 것을 배웠다.

+0

명시 적으로 2 차 예외를 어떻게 처리해야합니까? 대답에 포함하십시오. –

0

CausedException class에서 나는 간단한 원인 체인 대신 원인 트리를 전달하려는 경우를 대비하여 Python 2.x (및 Python 3도 마찬가지입니다.)를 처리합니다. 어쩌면 당신을 도울 수 있습니다.

+1

여기에 이론적으로 대답 할 수있는 답변이 있지만 (http://meta.stackexchange.com/q/8259) 여기에 답변의 핵심 부분을 포함하고 링크를 제공하는 것이 바람직합니다. 참조를 위해. –