Python 引发异常与打印?

Python 引发异常与打印?,python,exception,printing,Python,Exception,Printing,引发异常和简单地打印错误之间有什么区别 例如,使用以下选项有什么好处: if size < 0: raise ValueError('number must be non-negative') 如果大小

引发异常和简单地打印错误之间有什么区别

例如,使用以下选项有什么好处:

if size < 0:
        raise ValueError('number must be non-negative')
如果大小<0:
raise VALUERROR('数字必须为非负')
而不是简单地:

if size < 0:
        print 'number must be non-negative'
如果大小<0:
打印“编号必须为非负数”

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

这取决于您是否能够在检测到
大小<0
的点处处理
大小<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
如果大小<0:
打印“大小必须为非负片”
其他:
打印尺寸*4
我把你的剧本称为:

yours.py number_source.txt | sum_all_line.sh

如果
yours.py
在数字之间输出纯文本,那么我的
sum_all_line.sh
可能会失败,因为它需要所有数字。但是,如果
yours.py
由于异常而退出,那么
sum\u all\u line.sh
将无法完成,我将清楚地知道sum失败的原因


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

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

在这种情况下:

if size < 0:
    print 'number must be non-negative'
在这种情况下,程序将无法继续通过您的检查,将引发异常。如果未处理,则整个程序将终止


大多数情况下,您会希望引发异常,并拥有一个外部异常处理程序,该处理程序捕获异常并告知用户错误,如果可能,还允许用户重新输入输入。

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


…richie

您忽略了这一点:并且。当您尝试此代码时,您观察到了哪些差异?我可能应该指出,鉴于存在
zero-division-error
()
if size < 0:
    raise ValueError('number must be non-negative'