프로그램을 중단하지 않고 전체 역 추적을 인쇄하는 방법은 무엇입니까?
오류로 인해 프로그램을 중단하지 않으려면 try / except를 사용하여 해당 오류를 처리해야합니다.
try:
do_something_that_might_error()
except Exception as error:
handle_the_error(error)
전체 역 추적을 추출하기 위해 traceback
표준 라이브러리에서 모듈을 사용합니다 .
import traceback
그리고 전체 스택 트레이스를 얻는 것을 보여주기 위해 상당히 복잡한 스택 트레이스를 만들려면 다음을 수행하십시오.
def raise_error():
raise RuntimeError('something bad happened!')
def do_something_that_might_error():
raise_error()
인쇄
전체 역 추적 을 인쇄 하려면 다음 traceback.print_exc
방법을 사용하십시오 .
try:
do_something_that_might_error()
except Exception as error:
traceback.print_exc()
어떤 지문 :
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<stdin>", line 2, in do_something_that_might_error
File "<stdin>", line 2, in raise_error
RuntimeError: something bad happened!
인쇄, 로깅보다 낫습니다 :
그러나 모범 사례는 모듈에 로거를 설정하는 것입니다. 모듈의 이름을 알고 레벨을 변경할 수 있습니다 (핸들러와 같은 다른 속성 중에서)
import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
이 경우 logger.exception
대신 함수가 필요합니다.
try:
do_something_that_might_error()
except Exception as error:
logger.exception(error)
어떤 로그 :
ERROR:__main__:something bad happened!
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<stdin>", line 2, in do_something_that_might_error
File "<stdin>", line 2, in raise_error
RuntimeError: something bad happened!
또는 문자열을 원할 수도 있습니다.이 경우 traceback.format_exc
대신 함수가 필요합니다.
try:
do_something_that_might_error()
except Exception as error:
logger.debug(traceback.format_exc())
어떤 로그 :
DEBUG:__main__:Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<stdin>", line 2, in do_something_that_might_error
File "<stdin>", line 2, in raise_error
RuntimeError: something bad happened!
결론
그리고 세 가지 옵션 모두에 대해 오류가있을 때와 동일한 결과를 얻습니다.
>>> do_something_that_might_error()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in do_something_that_might_error
File "<stdin>", line 2, in raise_error
RuntimeError: something bad happened!
print(sys.exc_info()[0]
인쇄합니다<class 'Exception'>
.