답변:
Python 2.6 이상 및 Python 3.x의 경우 :
except Exception as e: print(e)
Python 2.5 및 이전 버전의 경우 다음을 사용하십시오.
except Exception,e: print str(e)
str( KeyError('bad'))
=> 'bad'
-예외 유형을 알려주지 않음
print(repr(e))
. 기본 Exception.__str__
구현은 유형이 아닌 예외 메시지 만 반환합니다. 또는 traceback
현재 예외, 형식 또는 전체 역 추적을 인쇄하는 방법이 있는 모듈을 사용하십시오 .
이 traceback
모듈은 예외 와 그 역 추적 을 형식화하고 인쇄 하는 방법을 제공합니다 . 예를 들어, 기본 핸들러처럼 예외를 인쇄합니다.
import traceback
try:
1/0
except Exception:
traceback.print_exc()
산출:
Traceback (most recent call last):
File "C:\scripts\divide_by_zero.py", line 4, in <module>
1/0
ZeroDivisionError: division by zero
error_message = traceback.format_exc()
except Exception as ex:
...
sys.exc_info()
함수 를 통해 사용할 수 있으며 함수 는 예외를 traceback.print_exc()
가져옵니다. 예외를 처리하지 않거나 다른 예외를 기반으로 정보를 표시하려는 경우에만 명시 적으로 예외를 전달하면됩니다.
Python 2.6 이상 에서는 약간 더 깨끗합니다.
except Exception as e: print(e)
이전 버전에서는 여전히 읽을 수 있습니다.
except Exception, e: print e
오류 문자열을 전달하려는 경우 오류 및 예외 의 예 (Python 2.6)
>>> try:
... raise Exception('spam', 'eggs')
... except Exception as inst:
... print type(inst) # the exception instance
... print inst.args # arguments stored in .args
... print inst # __str__ allows args to printed directly
... x, y = inst # __getitem__ allows args to be unpacked directly
... print 'x =', x
... print 'y =', y
...
<type 'exceptions.Exception'>
('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs
(@jldupont의 답변에 대한 의견으로 이것을 남겨 두려고했지만 평판이 충분하지 않습니다.)
다른 곳에서도 @jldupont의 답변과 같은 답변을 보았습니다. FWIW, 나는 이것을 주목하는 것이 중요하다고 생각합니다.
except Exception as e:
print(e)
sys.stdout
기본적으로 오류 출력을 인쇄합니다 . 일반적인 오류 처리 방법은 다음과 같습니다.
except Exception as e:
print(e, file=sys.stderr)
( import sys
이 작업을 수행해야합니다.) 이렇게하면 오류 STDERR
대신에 오류가 인쇄되어 STDOUT
올바른 출력 구문 분석 / 리디렉션 등이 가능합니다. 나는 문제가 '오류 인쇄'에 관한 것이지만, 더 잘 배우지 않는 사람에게는 비표준 코드로 이어질 수있는이 세부 사항을 생략하는 것이 아니라 모범 사례를 지적하는 것이 중요하다고 생각합니다.
나는 traceback
Cat Plus Plus의 답변에서와 같이 모듈을 사용하지 않았 으며 아마도 이것이 가장 좋은 방법 일지 모르지만 이것을 버릴 것이라고 생각했습니다.
logging
기본 print()
기능 을 사용하는 대신 보다 유연한 logging
모듈을 사용하여 예외를 기록 할 수 있습니다. 이 logging
모듈은 주어진 로그 파일에 메시지 기록, 타임 스탬프가 포함 된 메시지 기록 및 기록이 발생한 위치에 대한 추가 정보와 같은 많은 추가 기능을 제공합니다. (자세한 내용은 공식 문서를 확인하십시오 .)
다음과 같이 모듈 수준 함수를 사용하여 예외 로깅을 수행 할 수 있습니다 logging.exception()
.
import logging
try:
1/0
except BaseException:
logging.exception("An exception was thrown!")
산출:
ERROR:root:An exception was thrown!
Traceback (most recent call last):
File ".../Desktop/test.py", line 4, in <module>
1/0
ZeroDivisionError: division by zero
노트:
이 함수 logging.exception()
는 예외 처리기에서만 호출해야합니다
logging
모듈은 로깅을 방지하기 위해 처리기 내에서 사용하지 않아야 RecursionError
(감사 @PrakharPandey)를
다음 exc_info=True
과 같이 keyword 인수를 사용하여 다른 로그 수준으로 예외를 기록 할 수도 있습니다 .
logging.debug("An exception was thrown!", exc_info=True)
logging.info("An exception was thrown!", exc_info=True)
logging.warning("An exception was thrown!", exc_info=True)
예외를 잡을 때 역 추적 정보를 표시 / 로그 할 정보를 거의 제어 할 수 있습니다.
코드
with open("not_existing_file.txt", 'r') as text:
pass
다음과 같은 역 추적을 생성합니다.
Traceback (most recent call last):
File "exception_checks.py", line 19, in <module>
with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'
다른 사람들이 이미 언급했듯이 역 추적 모듈을 사용하여 전체 역 추적을 잡을 수 있습니다.
import traceback
try:
with open("not_existing_file.txt", 'r') as text:
pass
except Exception as exception:
traceback.print_exc()
결과는 다음과 같습니다.
Traceback (most recent call last):
File "exception_checks.py", line 19, in <module>
with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'
로깅을 사용하여 동일한 결과를 얻을 수 있습니다.
try:
with open("not_existing_file.txt", 'r') as text:
pass
except Exception as exception:
logger.error(exception, exc_info=True)
산출:
__main__: 2020-05-27 12:10:47-ERROR- [Errno 2] No such file or directory: 'not_existing_file.txt'
Traceback (most recent call last):
File "exception_checks.py", line 27, in <module>
with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'
전체 역 추적에 관심이 없을 수도 있지만 예외 이름 및 예외 메시지와 같은 가장 중요한 정보에만 다음을 사용하십시오.
try:
with open("not_existing_file.txt", 'r') as text:
pass
except Exception as exception:
print("Exception: {}".format(type(exception).__name__))
print("Exception message: {}".format(exception))
산출:
Exception: FileNotFoundError
Exception message: [Errno 2] No such file or directory: 'not_existing_file.txt'