我如何打印错误/异常在except:块?

try:
    ...
except:
    print(exception)

当前回答

在捕获异常时,可以控制显示/记录跟踪中的哪些信息。

的代码

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'

打印/记录完整的回溯

正如其他人已经提到的,你可以通过使用traceback模块来捕获整个跟踪:

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'

其他回答

#试试这个

try:

    print("Hare Krishna!")

except Exception as er:

    print(er)
    

如果您想这样做的话,可以使用assert语句来引发一行错误。这将帮助您编写静态可修复的代码并及早检查错误。

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

如果你想传递错误字符串,这里有一个来自错误和异常(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

我建议使用try-except语句。此外,日志异常不是使用print语句,而是在记录器上记录级别为ERROR的消息,我发现这比print输出更有效。该方法只能从异常处理程序调用,如下所示:

import logging

try:
    *code goes here*
except BaseException:
    logging.exception("*Error goes here*")

如果你想了解更多关于日志记录和调试的知识,这个python页面上有很好的文档。

(我本来想把这个作为对@jldupont的回答的评论,但我没有足够的声誉。)

我在其他地方也看到过@jldupont这样的回答。FWIW,我认为有一点很重要:

except Exception as e:
    print(e)

将错误输出输出到sys。默认为Stdout。一般来说,更合适的错误处理方法是:

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

(注意,你必须导入sys才能工作。)通过这种方式,错误被打印到STDERR而不是STDOUT,这允许正确的输出解析/重定向等。我知道这个问题严格来说是关于“打印错误”的,但在这里指出最佳实践而不是忽略这个细节,这可能会导致那些最终没有更好地学习的人使用非标准代码,这似乎很重要。

我没有像Cat Plus Plus的答案中那样使用traceback模块,也许这是最好的方法,但我想我要把它放在那里。