在except:
块中如何打印错误/异常信息?
try:
...
except:
print(exception)
在except:
块中如何打印错误/异常信息?
try:
...
except:
print(exception)
对于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'
。该代码未标明异常类型。 - Daveprint(repr(e))
;基类Exception.__str__
的实现仅返回异常信息而不包括类型。或者使用traceback
模块,它具有用于打印当前异常的方法,可以格式化输出或以完整的回溯信息形式打印。 - Martijn Pietersrepr(e)
将会给出堆栈跟踪?我在谈论 str(e)
和 repr(e)
之间的区别,后者包含了更多信息,你也会在回溯(traceback)的最后一行或几行看到这些信息。我在我的评论中明确提到了 traceback
模块。 - Martijn Pietersprint(repr(e))
,而对于回溯(traceback)你只给出了一些通用语句,说明它有多种方法来打印异常。这听起来像是你更倾向于使用repr()
方法,由于你的评论得到了很多赞,我认为值得写一个明显的回复,谈谈存在哪些更好的方法。 - Hi-Angelexcept Exception as ex:
... - aaronsteerssys.exc_info()
函数获取当前异常,并且traceback.print_exc()
函数从那里获取异常。只有在不处理异常或想要基于不同的异常显示信息时,才需要显式传递异常。 - Martijn Pieters在Python 2.6或更高版本中,这样会更简洁:
except Exception as e: print(e)
在旧版本中,它仍然相当易读:
except Exception, e: print e
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.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
(我本来想在@jldupont的回答下留言,但我的声望不够。)
我在其他地方也看过像@jldupont的回答。顺便说一句,我认为需要注意的是这个:
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 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
在捕获异常时,可以控制需要显示/记录的回溯信息。
代码:
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'
f
表示这是一个f-string
,它允许您将表达式放在花括号中,而不是使用.format()
。但是,f-strings
仅适用于运行Python 3.6+的系统。 - theProCoder在这里扩展“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:
,没有其他内容。 - Farid Alijani试一下这个
try:
print("Hare Krishna!")
except Exception as er:
print(er)
import logging
try:
*code goes here*
except BaseException:
logging.exception("*Error goes here*")
如果您想了解有关日志记录和调试的更多信息,请参阅此Python页面上的好文档。