파이썬 3에는 예외를 연결 하는 raise
... from
절이 있습니다. 글렌의 답변 은 Python 2.7에 적합하지만 원래 예외의 역 추적 만 사용하고 오류 메시지 및 기타 세부 정보를 버립니다. 다음은 현재 범위의 컨텍스트 정보를 원래 예외의 오류 메시지에 추가하지만 다른 세부 정보는 그대로 유지하는 Python 2.7의 일부 예입니다.
알려진 예외 유형
try:
sock_common = xmlrpclib.ServerProxy(rpc_url+'/common')
self.user_id = sock_common.login(self.dbname, username, self.pwd)
except IOError:
_, ex, traceback = sys.exc_info()
message = "Connecting to '%s': %s." % (config['connection'],
ex.strerror)
raise IOError, (ex.errno, message), traceback
맛의 raise
문 제 식 번째 식과 튜플의 예외 클래스 생성자 인수 및 제 표현식으로 추적 같은 예외 유형 걸린다. Python 2.2 이전 버전을 실행중인 경우의 경고를 참조하십시오 sys.exc_info()
.
모든 예외 유형
다음은 코드에서 어떤 종류의 예외를 포착해야하는지 모르는 경우보다 일반적인 목적의 또 다른 예입니다. 단점은 예외 유형이 손실되고 RuntimeError가 발생한다는 것입니다. traceback
모듈 을 가져와야합니다 .
except Exception:
extype, ex, tb = sys.exc_info()
formatted = traceback.format_exception_only(extype, ex)[-1]
message = "Importing row %d, %s" % (rownum, formatted)
raise RuntimeError, message, tb
메시지 수정
예외 유형으로 컨텍스트를 추가 할 수있는 다른 옵션이 있습니다. 예외 메시지를 수정 한 다음 다시 가져올 수 있습니다.
import subprocess
try:
final_args = ['lsx', '/home']
s = subprocess.check_output(final_args)
except OSError as ex:
ex.strerror += ' for command {}'.format(final_args)
raise
다음과 같은 스택 추적이 생성됩니다.
Traceback (most recent call last):
File "/mnt/data/don/workspace/scratch/scratch.py", line 5, in <module>
s = subprocess.check_output(final_args)
File "/usr/lib/python2.7/subprocess.py", line 566, in check_output
process = Popen(stdout=PIPE, *popenargs, **kwargs)
File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1327, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory for command ['lsx', '/home']
check_output()
호출 된 행을 표시 하지만 예외 메시지에 명령 행이 포함되어 있음을 알 수 있습니다.