파이썬에서 예외를 인쇄하는 방법?


답변:


1061

Python 2.6 이상 및 Python 3.x의 경우 :

except Exception as e: print(e)

Python 2.5 및 이전 버전의 경우 다음을 사용하십시오.

except Exception,e: print str(e)

41
str( KeyError('bad'))=> 'bad'-예외 유형을 알려주지 않음
Dave

10
keyerrors에 print (e)는 키만 제공하지만 전체 예외 메시지는 제공하지 않는 것 같습니다.
Veggiet

14
예외를 인쇄하려면 사용하는 것이 좋습니다 print(repr(e)). 기본 Exception.__str__구현은 유형이 아닌 예외 메시지 만 반환합니다. 또는 traceback현재 예외, 형식 또는 전체 역 추적을 인쇄하는 방법이 있는 모듈을 사용하십시오 .
Martijn Pieters

450

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

3
나 자신의 인쇄 루틴을 사용하여 다른 것을 추가하면서 볼 수있는 get_error_message 호출이 있습니까?
MikeSchem

10
@MikeSchem error_message = traceback.format_exc()
heyzling

3
고마워요, 이것이 내가 원하는 것입니다. 전체 추적뿐만 아니라 오류 유형 및 메시지
켄 벨로우즈

이 스니핑은 캡처 된 예외 오브젝트를 사용하지 않습니다. 'ex'를 사용하도록 코드를 확장 할 수 있습니까? - 같이 except Exception as ex:...
aaronsteers

@aaronsteers는 캡처 된 예외를 사용합니다. 예외 처리기에서 현재 예외는 sys.exc_info()함수 를 통해 사용할 수 있으며 함수 는 예외를 traceback.print_exc()가져옵니다. 예외를 처리하지 않거나 다른 예외를 기반으로 정보를 표시하려는 경우에만 명시 적으로 예외를 전달하면됩니다.
Martijn Pieters

169

Python 2.6 이상 에서는 약간 더 깨끗합니다.

except Exception as e: print(e)

이전 버전에서는 여전히 읽을 수 있습니다.

except Exception, e: print e

15
python3에서는 "as"와 함께 첫 번째 방법을 사용해야합니다.
Sam Watkins

53

오류 문자열을 전달하려는 경우 오류 및 예외 의 예 (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

38

(@jldupont의 답변에 대한 의견으로 이것을 남겨 두려고했지만 평판이 충분하지 않습니다.)

다른 곳에서도 @jldupont의 답변과 같은 답변을 보았습니다. FWIW, 나는 이것을 주목하는 것이 중요하다고 생각합니다.

except Exception as e:
    print(e)

sys.stdout기본적으로 오류 출력을 인쇄합니다 . 일반적인 오류 처리 방법은 다음과 같습니다.

except Exception as e:
    print(e, file=sys.stderr)

( import sys이 작업을 수행해야합니다.) 이렇게하면 오류 STDERR대신에 오류가 인쇄되어 STDOUT올바른 출력 구문 분석 / 리디렉션 등이 가능합니다. 나는 문제가 '오류 인쇄'에 관한 것이지만, 더 잘 배우지 않는 사람에게는 비표준 코드로 이어질 수있는이 세부 사항을 생략하는 것이 아니라 모범 사례를 지적하는 것이 중요하다고 생각합니다.

나는 tracebackCat Plus Plus의 답변에서와 같이 모듈을 사용하지 않았 으며 아마도 이것이 가장 좋은 방법 일지 모르지만 이것을 버릴 것이라고 생각했습니다.


1
flush = True를 더 추가하는 것이 좋습니다. 나는 systemd (및 적절한 로깅 프레임 워크를 사용하지 않음)를 사용하여 저널에 캡처 할 때 버퍼링이 예상했던 것이 아니라는 것을 알았습니다.
Cameron Kerr

20

파이썬 3 : 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)

1
RecursionError를 피하기 위해 로깅 처리기 내부에서 사용하면 안됩니다
Prakhar Pandey

4

assert 문으로 하나의 라이너 오류 발생을 수행 할 수 있습니다. 이것은 정적으로 수정 가능한 코드를 작성하고 오류를 조기에 확인하는 데 도움이됩니다.

assert type(A) is type(""), "requires a string"

2

예외를 잡을 때 역 추적 정보를 표시 / 로그 할 정보를 거의 제어 할 수 있습니다.

코드

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'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.