try:
something here
except:
print 'the whatever error occurred.'
如何在我的except:块中打印错误/异常?
我建议更改标题:您没有打印错误,您正在打印异常。它们是不同的。
相关:如何在不停止程序的情况下打印完整的回溯?
对于python 2.6及更高版本和python 3.x:
except Exception as e: print(e)
对于python 2.5及更早版本,请使用:
except Exception,e: print str(e)
str()部分是多余的--print e与print str(e)完全相同[即print自己做串接]]。
@亚历克斯:这不是取决于抛出的异常的子类(如果有的话)吗?repr方法可能尚未实现,而str可能已经实现。在任何情况下,我想没有一个好的替代品可以替代不完整的实现;-)
在python3的fwiw需要像其他答案一样使用EDOCX1[4]
str( KeyError('bad'))=>'bad'--不告诉异常类型
我只是想说,type(e)不是所以如果你想在e中检查一个字符串,你不能只检查"str" in e,你必须检查"str" in str(e),至少对于python 2.7
对于任何对这篇老文章感兴趣的人来说,这对于Python3.6仍然有效。
在keyerrors上的print(e)似乎只给出了密钥,但没有给出完整的异常消息,这并没有什么帮助。
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
1/0
ZeroDivisionError: division by zero
当我使用自己的打印程序添加其他内容时,是否有某种"获取错误"消息调用可以通过"查看"进行打印?
@米凯舍姆·埃多克斯(Mikeshem EDOCX1)(12)
谢谢,这是我想要的。整个跟踪,而不仅仅是错误类型和消息
在python 2.6或更高版本中,它有点干净:
except Exception as e: print(e)
在旧版本中,它仍然非常可读:
except Exception, e: print e
在python3中,必须使用第一种方式,并使用"as"。
如果您想传递错误字符串,下面是一个来自错误和异常的示例(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
...
('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs
非常完整,尽管在python2.6之前"as"不起作用
(我本来打算留下这句话作为对@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模块,也许这是最好的方法,但我想我会把它扔掉。
这个应该得到更多的赞成票
我建议进一步添加flush=true。我注意到SystemD(并且没有使用适当的日志框架),当捕获到日志时缓冲并不是我所期望的。
如果您想这样做,可以使用断言语句来执行一个线性错误引发。这将帮助您编写静态的可修复代码并尽早检查错误。
assert type(A) is type(""),"requires a string"