抛出异常与打印?
抛出异常和直接打印错误信息有什么区别呢?
比如,使用下面的代码有什么好处:
if size < 0:
raise ValueError('number must be non-negative')
而不是简单地:
if size < 0:
print 'number must be non-negative'
我还是个新手,请多多包涵。:)
4 个回答
主要的区别在于,当你进行错误检查后,程序是否会继续运行。
对于第一种情况:
if size < 0:
print 'number must be non-negative'
这段代码只会把信息打印到标准输出,程序会继续执行后面的代码。所以如果在你代码的某个地方使用了 size
,而它的值小于 0
,你可能会遇到错误。
对于第二种情况:
if size < 0:
raise ValueError('number must be non-negative'
在这种情况下,程序不会继续执行,而是会抛出一个异常。如果这个异常没有被处理,整个程序就会终止。
大多数情况下,你会希望抛出一个异常,并且有一个外部的异常处理器来捕捉这个异常,告诉用户发生了什么错误,并且如果可能的话,允许他们重新输入。
这要看你能不能在发现 size < 0
的时候处理这个情况。
如果你能直接打印出来,那就用 print
,否则就抛出一个异常,把处理这个问题的责任交给调用这个函数的地方,像这样:
def divide_three_by(val):
if val == 0:
raise ValueError("Can't divide by 0")
return 3/val
try:
divide_three_by(some_value_from_user)
except ValueError:
print "You gave stupid input"
在上面的例子中,虽然有点牵强,但 divide_three_by
这个函数不知道如果你传入 0 应该怎么办——有时候你可能只是想打印个消息(比如 val
是用户输入的),有时候你可能想忽略这个值,给它一个默认值。因为这个函数不知道该怎么处理,所以它应该把处理这个情况的责任交给调用它的地方。如果那里也处理不了,就会继续往上抛,直到有地方能处理,或者到达最上层,这时你的程序就会结束。
想了解更多关于 Python 中异常处理的内容,可以看看 Python 文档中的 错误和异常教程。
抛出错误会让整个程序在那一刻停止运行(除非这个错误被捕获),而打印信息只是把内容写到stdout
上——这些输出可能会被传给其他工具,或者有人可能不是从命令行运行你的程序,这样print
的输出可能根本看不到。
比如说,如果你的代码是这样的:
if size < 0:
print 'size must be non-negative'
else:
print size * 4
然后我这样调用你的脚本:
yours.py number_source.txt | sum_all_lines.sh
如果yours.py
在数字之间输出了普通文本,那么我的sum_all_lines.sh
可能会失败,因为它期待的都是数字。然而,如果yours.py
因为一个错误而退出,那么sum_all_lines.sh
就不会完成,这样我就能清楚地知道为什么求和失败了。
当然,这只是一个例子,你的具体情况可能完全不同。