提问人:TIMEX 提问时间:9/27/2009 最后编辑:Mateen UlhaqTIMEX 更新时间:2/10/2023 访问量:1936202
如何在 Python 中打印异常?
How do I print an exception in Python?
答:
如果您想传递错误字符串,以下是错误和异常 (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
对于 Python 2.6 及更高版本和 Python 3.x:
except Exception as e: print(e)
对于 Python 2.5 及更早版本,请使用:
except Exception,e: print str(e)
评论
str( KeyError('bad'))
=> 'bad'
-- 不告诉异常类型
print(repr(e))
Exception.__str__
traceback
print(repr(e))
print_exc
repr(e)
str(e)
repr(e)
traceback
traceback
模块提供了格式化和打印异常及其回溯的方法,例如,这将像默认处理程序一样打印异常:
import traceback
try:
1/0
except Exception:
traceback.print_exc()
输出:
Traceback (most recent call last):
File "C:\scripts\divide_by_zero.py", line 4, in <module>
1/0
ZeroDivisionError: division by zero
评论
error_message = traceback.format_exc()
except Exception as ex:
sys.exc_info()
traceback.print_exc()
如果这是您想要执行的,则可以使用断言语句来完成一次行错误引发。这将帮助您编写静态可修复的代码并尽早检查错误。
assert type(A) is type(""), "requires a string"
评论
assert
语句不应用于正常逻辑;如果 Python 使用 .参见 python(1)。-O
在 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 Plus 的回答那样使用过该模块,也许这是最好的方法,但我想我会把它扔在那里。traceback
评论
Python 3:logging
可以使用更灵活的日志模块
来记录异常,而不是使用基本功能。该模块提供了许多额外的功能,例如,记录消息......print()
logging
- 添加到给定的日志文件中,或者
- 带有时间戳和有关日志记录发生位置的其他信息。
有关更多信息,请查看官方文档。
用法
记录异常可以使用模块级函数 logging.exception()
完成,如下所示:
import logging
try:
1/0
except 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/0
ZeroDivisionError: division by zero
笔记
该函数只能从异常处理程序中调用
logging.exception()
该模块不应在日志记录处理程序中使用,以避免 (感谢 @PrakharPandey)
logging
RecursionError
备用日志级别
也可以使用另一个日志级别记录异常,但仍然使用关键字参数显示异常详细信息,如下所示: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 form
logging.log(level, "An exception was thrown!", exc_info=True)
仅名称和描述
当然,如果你不想要整个回溯,而只想要一些特定的信息(例如,异常名称和描述),你仍然可以像这样使用该模块:logging
try:
1/0
except BaseException as exception:
logging.warning(f"Exception Name: {type(exception).__name__}")
logging.warning(f"Exception Desc: {exception}")
输出
WARNING:root:Exception Name: ZeroDivisionError
WARNING: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 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'
评论
Exception
Exception Message
print
print(f"Exception: {type(exception).__name__}\nException message: {exception}")
.开头的 表示它是一个 ,它只允许您将表达式放在大括号中,而不是使用 。 但是,仅适用于运行 Python 3.6+ 的系统f
f-string
.format()
f-strings
从“except Exception as e:”解决方案中扩展出来,这是一个不错的行,其中包括一些附加信息,例如错误类型和发生位置。
try:
1/0
except 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
评论
pint(e)
Message:
我建议使用 try-except 语句。此外,日志记录异常不是使用 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)
评论