programing

e. printStackTrace 등가 python

procenter 2022. 10. 30. 16:18
반응형

e. printStackTrace 등가 python

나는 그것을 알고 있습니다.print(e)(여기서 e는 예외입니다)는 발생한 예외를 출력합니다만, 저는 자바와 동등한 python을 찾으려고 했습니다.e.printStackTrace()발생한 행에 대한 예외를 정확하게 추적하고 전체 트레이스를 인쇄합니다.

에 상당하는 것을 누구라도 가르쳐 주세요.e.printStackTrace()Python으로요?

import traceback
traceback.print_exc()

실내에서 이 작업을 수행할 수 있습니다.except ...:차단하면 현재 예외가 자동으로 사용됩니다.상세한 것에 대하여는, http://docs.python.org/library/traceback.html 를 참조해 주세요.

또 있다logging.exception.

import logging

...

try:
    g()
except Exception as ex:
    logging.exception("Something awful happened!")
    # will print this message followed by traceback

출력:

ERROR 2007-09-18 23:30:19,913 error 1294 Something awful happened!
Traceback (most recent call last):
  File "b.py", line 22, in f
    g()
  File "b.py", line 14, in g
    1/0
ZeroDivisionError: integer division or modulo by zero

(프로그램을 정지하지 않고 완전한 트레이스 백을 인쇄하려면 http://blog.tplus1.com/index.php/2007/09/28/the-python-logging-module-is-much-better-than-print-statements/ 에서 http://blog.tplus1.com/index.php/2007/09/28/the-python-logging-module-is-much-better-than-print-statements/ 를 참조해 주세요.

e. printStackTrace 등가 python

Java에서는 다음(docs)을 수행합니다.

public void printStackTrace()

이 폐기 가능 및 역추적을 표준 오류 스트림으로 인쇄합니다.

이것은 다음과 같이 사용됩니다.

try
{ 
// code that may raise an error
}
catch (IOException e)
{
// exception handling
e.printStackTrace();
}

Java에서는 표준 오류 스트림이 버퍼 해제되어 출력이 즉시 도착합니다.

Python 2의 동일한 의미는 다음과 같습니다.

import traceback
import sys
try: # code that may raise an error
    pass 
except IOError as e: # exception handling
    # in Python 2, stderr is also unbuffered
    print >> sys.stderr, traceback.format_exc()
    # in Python 2, you can also from __future__ import print_function
    print(traceback.format_exc(), file=sys.stderr)
    # or as the top answer here demonstrates, use:
    traceback.print_exc()
    # which also uses stderr.

파이썬 3

Python 3에서는 예외 객체에서 직접 트레이스백을 얻을 수 있습니다(스레드 코드에 대해 더 잘 동작합니다).또한 stderr은 라인 버퍼링되지만 print 함수는 flush 인수를 취득하기 때문에 이것은 stderr에 즉시 인쇄됩니다.

    print(traceback.format_exception(None, # <- type(e) by docs, but ignored 
                                     e, e.__traceback__),
          file=sys.stderr, flush=True)

결론:

따라서 Python 3에서는traceback.print_exc()단,sys.stderr 디폴트로는는 출력을 버퍼링하기 때문에 손실될 수 있습니다.따라서 Python 3에서 가능한 동등한 의미론을 얻으려면print와 함께flush=True.

다른 훌륭한 답변에 덧붙여, Python을 사용할 수 있습니다.logging라이브러리의debug(),info(),warning(),error(),그리고.critical()방법들.Python 3.7.4 관련 문서를 인용하면,

검사되는 kwargs에는 exc_info라는3개의 키워드 인수가 있습니다.exc_info는 false로 평가되지 않을 경우 로그 메시지에 예외 정보가 추가됩니다.

이것은 Python을 사용할 수 있다는 것을 의미합니다.logging출력하는 라이브러리debug()또는 기타 유형의 메시지 및logging라이브러리는 스택트레이스를 출력에 포함합니다.이 점에 유의하여 다음 작업을 수행할 수 있습니다.

import logging

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

def f():
    a = { 'foo': None }
    # the following line will raise KeyError
    b = a['bar']

def g():
    f()

try:
    g()
except Exception as e:
    logger.error(str(e), exc_info=True)

출력:

'bar'
Traceback (most recent call last):
  File "<ipython-input-2-8ae09e08766b>", line 18, in <module>
    g()
  File "<ipython-input-2-8ae09e08766b>", line 14, in g
    f()
  File "<ipython-input-2-8ae09e08766b>", line 10, in f
    b = a['bar']
KeyError: 'bar'

언급URL : https://stackoverflow.com/questions/9555133/e-printstacktrace-equivalent-in-python

반응형