e.printStackTrace эквивалент в Python
В Java это делает следующее ( документы ):
public void printStackTrace()
Печатает этот throwable и его backtrace к стандартному потоку ошибок ...
Это используется так:
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.
Python 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
with flush=True
.
format_exc
вместо этого получить строку.