问题:如何在Python中打印异常?
try:
something here
except:
print('the whatever error occurred.')
如何在except:
块中打印错误/异常?
回答 0
对于Python 2.6和更高版本以及Python 3.x:
except Exception as e: print(e)
对于Python 2.5及更早版本,请使用:
except Exception,e: print str(e)
回答 1
该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
回答 2
在Python 2.6或更高版本中,它更干净一些:
except Exception as e: print(e)
在旧版本中,它仍然很可读:
except Exception, e: print e
回答 3
如果您想传递错误字符串,这是错误和异常(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
回答 4
(我打算将其作为对@jldupont答案的评论,但我没有足够的声誉。)
我在其他地方也看到过类似@jldupont的答案的答案。FWIW,我认为必须注意以下几点:
except Exception as e:
print(e)
sys.stdout
默认将错误输出打印到。通常,更合适的错误处理方法是:
except Exception as e:
print(e, file=sys.stderr)
(请注意,您必须import sys
执行此操作。)这样,将错误打印到STDERR
而不是STDOUT
,从而可以进行正确的输出解析/重定向/等。我知道问题完全是关于“打印错误”的,但是在此处指出最佳实践而不是忽略可能导致最终学习不到的标准代码的细节似乎很重要。
我没有traceback
在Cat Plus Plus的答案中使用该模块,也许这是最好的方法,但是我想我应该把它扔在那里。
回答 5
Python 3: logging
除了使用基本print()
功能,logging
还可以使用更灵活的模块来记录异常。该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()
只能从异常处理程序中调用该
logging
模块不应在日志记录处理程序中使用,以免出现RecursionError
(感谢@PrakharPandey)
备用日志级别
也可以使用关键字参数将异常记录到另一个日志级别,exc_info=True
如下所示:
logging.debug("An exception was thrown!", exc_info=True)
logging.info("An exception was thrown!", exc_info=True)
logging.warning("An exception was thrown!", exc_info=True)
回答 6
如果您要这样做,可以使用assert语句来完成一次线性错误提升。这将帮助您编写可静态修复的代码并及早检查错误。
assert type(A) is type(""), "requires a string"
回答 7
在捕获异常时,几乎可以控制要显示/记录的追溯信息。
编码
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模块捕获整个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'