我想在不退出的情况下捕获和记录异常,例如,

try:
    do_stuff()
except Exception as err:
    print(Exception, err)
    # I want to print the entire traceback here,
    # not just the exception name and details

我想打印与抛出异常时打印的完全相同的输出,而不使用try/,只是拦截异常,并且我不希望它退出程序。


当前回答

import io
import traceback

try:
    call_code_that_fails()
except:

    errors = io.StringIO()
    traceback.print_exc(file=errors)  # Instead of printing directly to stdout, the result can be further processed
    contents = str(errors.getvalue())
    print(contents)
    errors.close()

其他回答

Traceback.format_exc()或sys.exc_info()将产生更多信息,如果这是你想要的。

import traceback
import sys

try:
    do_stuff()
except Exception:
    print(traceback.format_exc())
    # or
    print(sys.exc_info()[2])

你可以这样做:

try:
    do_stuff()
except Exception, err:
    print(Exception, err)
    raise err

您需要traceback模块。它将允许您像Python通常那样打印堆栈转储。特别是,print_last函数将打印最后一个异常和堆栈跟踪。

关于这个答案的注释:print(traceback.format_exc())对我来说比traceback.print_exc()更好。对于后者,hello有时会奇怪地与回溯文本“混合”在一起,比如两者都想同时写入stdout或stderr,产生奇怪的输出(至少在从文本编辑器内部构建并在“构建结果”面板中查看输出时)。

回溯(最近一次调用): 文件“C:\Users\User\Desktop\test.py”,第7行,在 地狱do_stuff () 文件“C:\Users\User\Desktop\test.py”,第4行,do_stuff 1/0 ZeroDivisionError:整数除法或对0取模 o [0.1s完成]

所以我用:

import traceback, sys

def do_stuff():
    1/0

try:
    do_stuff()
except Exception:
    print(traceback.format_exc())
    print('hello')

如果你已经有了一个Error对象,并且你想打印整个东西,你需要做这个有点尴尬的调用:

import traceback
traceback.print_exception(type(err), err, err.__traceback__)

没错,print_exception接受三个位置参数:异常的类型、实际的异常对象和异常自身的内部回溯属性。

在python 3.5或更高版本中,类型(err)是可选的…但它是一个位置参数,所以你仍然需要显式地在它的位置传递None。

traceback.print_exception(None, err, err.__traceback__)

我不知道为什么所有这些不只是traceback.print_exception(err)。为什么你会想打印出一个错误,以及一个回溯,而不是属于该错误的,这超出了我的理解。