try:
something here
except:
print 'the whatever error occurred.'
如何在except:
块中打印错误/异常?
答案 0 :(得分:725)
对于Python 2.6及更高版本和Python 3.x:
except Exception as e: print(e)
对于Python 2.5及更早版本,请使用:
except Exception,e: print str(e)
答案 1 :(得分:323)
traceback
模块提供formatting and printing exceptions及其追溯的方法,例如这会像默认处理程序那样打印异常:
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 :(得分:162)
在 Python 2.6或更高版本中,它更清晰:
except Exception as e: print(e)
在旧版本中,它仍然具有可读性:
except Exception, e: print e
答案 3 :(得分:46)
如果你想传递错误字符串,这里是Errors and Exceptions的一个例子(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 :(得分:29)
(我打算将其作为对@jldupont答案的评论,但是我没有足够的声誉。)
我在其他地方也看到过类似@jldupont的答案的答案。 FWIW,我认为必须注意以下几点:
except Exception as e:
print(e)
默认情况下会将错误输出打印到sys.stdout
。通常,更合适的错误处理方法是:
except Exception as e:
print(e, file=sys.stderr)
(请注意,您必须import sys
才能起作用。)这样,错误将输出到STDERR
而不是STDOUT
,这允许正确的输出解析/重定向。 /等等。我了解这个问题完全是关于“打印错误”的,但在此处指出最佳实践而不是忽略此细节可能很重要,因为这可能导致最终没有学得更好的人使用非标准代码。 / p>
我没有像Cat Plus Plus的回答那样使用traceback
模块,也许这是最好的方法,但是我想我应该把它扔在那里。
答案 5 :(得分:20)
一个人可以很好地控制捕获异常时要显示/记录的追溯信息。
代码
.gitignore
将产生以下回溯:
with open("not_existing_file.txt", 'r') as text:
pass
正如其他人已经提到的那样,您可以通过使用traceback模块来捕获整个traceback:
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'
这将产生以下输出:
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))
答案 6 :(得分:5)
如果这是您想要做的事情,可以使用assert语句完成一个线程错误提升。这将帮助您编写静态可修复的代码并尽早检查错误。
assert type(A) is type(""), "requires a string"
答案 7 :(得分:5)
展开“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
答案 8 :(得分:4)
logging
可以使用更灵活的logging
模块来记录异常,而不是使用基本的print()
函数。 logging
模块提供了许多额外的功能,例如将消息记录到给定的日志文件中,记录带有时间戳的消息以及有关记录发生位置的其他信息。 (有关更多信息,请查看官方documentation。)
可以通过模块级功能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()
。
也可以通过使用关键字参数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)
答案 9 :(得分:0)
如果要将消息打印到stderr,然后以状态代码1(错误)退出:
import sys
try:
...
except Exception as e:
sys.exit("Message to print to stderr")
答案 10 :(得分:0)
我建议使用 try-except 语句。此外,日志异常不是使用打印语句,而是在记录器上记录级别为 ERROR 的消息,我发现这比打印输出更有效。此方法只能从异常处理程序中调用,如下所示:
import logging
try:
*code goes here*
except BaseException:
logging.exception("*Error goes here*")
如果您想了解有关日志记录和调试的更多信息,可以在 this python page 上找到很好的文档。