如何在Python中打印异常?

如何打印except:块中的错误/异常?

try:...except:print(exception)
1571388 次浏览

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

对于Python 2.6及更高版本和Python 3. x:

except Exception as e: print(e)

对于Python 2.5及更早版本,请使用:

except Exception,e: print str(e)

#0模块为格式化和打印例外及其回溯提供了方法,例如,这将像默认处理程序一样打印异常:

import traceback
try:1/0except Exception:traceback.print_exc()

输出:

Traceback (most recent call last):File "C:\scripts\divide_by_zero.py", line 4, in <module>1/0ZeroDivisionError: division by zero

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

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

Python 2.6或更高版本中,它有点干净:

except Exception as e: print(e)

在旧版本中,它仍然具有可读性:

except Exception, e: print e

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

我在其他地方也看到过像@jlduPont这样的答案。FWIW,我认为重要的是要注意这一点:

except Exception as e:print(e)

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

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

(请注意,您必须import sys才能工作。)这样,错误被打印到STDERR而不是STDOUT,这允许正确的输出解析/重定向/等。我知道这个问题严格来说是关于“打印错误”的,但在这里指出最佳实践似乎很重要,而不是遗漏这个细节,这可能会导致任何最终无法更好地学习的人的非标准代码。

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

Python 3:logging

可以使用更灵活的#1模块来记录异常,而不是使用基本的print()函数。logging模块提供了很多额外的功能,例如,记录消息…

  • 到给定的日志文件,或
  • 带有时间戳和有关日志记录发生位置的其他信息。

有关更多信息,请查看官方留档


用法

可以使用模块级函数#0记录异常,如下所示:

import logging
try:1/0except BaseException:logging.exception("An exception was thrown!")

产出

ERROR:root:An exception was thrown!Traceback (most recent call last):File ".../Desktop/test.py", line 4, in <module>1/0ZeroDivisionError: division by zero

备注

  • 函数logging.exception()只能从异常处理程序调用

  • logging模块不应该在日志处理程序中使用以避免RecursionError(感谢@PrakharPandey)


替代对数级别

也可以使用另一个对数电平记录异常,但仍然可以使用关键字参数exc_info=True显示异常详细信息,如下所示:

logging.critical("An exception was thrown!", exc_info=True)logging.error   ("An exception was thrown!", exc_info=True)logging.warning ("An exception was thrown!", exc_info=True)logging.info    ("An exception was thrown!", exc_info=True)logging.debug   ("An exception was thrown!", exc_info=True)
# or the general formlogging.log(level, "An exception was thrown!", exc_info=True)

仅限姓名和描述

当然,如果你不想要整个回溯,而只想要一些特定的信息(例如,异常名称和描述),你仍然可以像这样使用logging模块:

try:1/0except BaseException as exception:logging.warning(f"Exception Name: {type(exception).__name__}")logging.warning(f"Exception Desc: {exception}")

产出

WARNING:root:Exception Name: ZeroDivisionErrorWARNING:root:Exception Desc: division by zero

在捕获异常时,几乎可以控制来自回溯的哪些信息要显示/记录。

该代码

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 tracebacktry:with open("not_existing_file.txt", 'r') as text:passexcept 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:passexcept 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:passexcept Exception as exception:print("Exception: {}".format(type(exception).__name__))print("Exception message: {}".format(exception))

输出:

Exception: FileNotFoundErrorException message: [Errno 2] No such file or directory: 'not_existing_file.txt'

在这里扩展“除异常为e:”的解决方案是一个很好的单行,其中包括一些额外的信息,如错误类型和发生的位置。

try:1/0except Exception as e:print(f"{type(e).__name__} at line {e.__traceback__.tb_lineno} of {__file__}: {e}")

输出:

ZeroDivisionError at line 48 of /Users/.../script.py: division by zero

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

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

如果您想了解有关日志记录和调试的更多信息,可以在这个python页面上留档。

#试试这个

try:
print("Hare Krishna!")
except Exception as er:
print(er)