提高异常与打印?

时间:2010-01-27 11:59:15

标签: python exception printing

提出异常和打印错误之间的区别是什么。

例如,使用以下内容的好处是什么:

if size < 0:
        raise ValueError('number must be non-negative')

而不仅仅是:

if size < 0:
        print 'number must be non-negative'

我是新手,请放轻松我。 :)

4 个答案:

答案 0 :(得分:8)

Raising an error在此时暂停整个程序(除非捕获到异常),而printing消息只是将内容写入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将无法完成,并且我很清楚为什么总和失败。

当然,这只是一个例子,你的具体情况可能完全不同。

答案 1 :(得分:6)

这取决于您是否可以在检测到size < 0时处理size < 0

如果您可以通过直接打印来处理它,那么print,否则,引发异常,将该条件的处理委托给callstack上的某些内容,如下所示:

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"

在上面的(无可否认的非常人为的)示例中,如果传入0,divide_three_by函数不知道该怎么做 - 有时您可能只想打印一条消息(例如val来自用户输入),有时你可能想忽略它,并指定一个默认值。由于该函数不知道该怎么做,它应该将处理该条件的责任传递给callstack到任何调用它(如果它不能在那里处理,它将继续被传递到callstack直到某些东西处理它,或直到它达到顶级,此时你的程序将终止。

有关在Python中处理异常的更多信息 - 请查看Python文档中的Errors and Exceptions tutorial

答案 2 :(得分:3)

另一个考虑因素是开发可能在其他程序中使用的模块。在这种情况下,最好抛出异常并让调用代码处理错误。来电者应该知道出了问题并采取相应的行动。

...里奇

答案 3 :(得分:2)

关键区别在于错误检查后程序是否会继续运行。

对于这种情况:

if size < 0:
    print 'number must be non-negative'

这只会将信息打印到标准输出,程序将继续检查。因此,如果您稍后在代码中稍后使用size,那么0可能会导致错误。

对于另一种情况:

if size < 0:
    raise ValueError('number must be non-negative'

在这种情况下,程序不会继续通过您的检查,将引发异常。如果没有处理,则整个程序将终止。

大多数情况下,您需要引发异常并拥有一个外部异常处理程序来捕获异常并告诉使用错误,如果可能,允许它们重新输入输入。