提高异常与打印?

3zz*_*zzy 11 python printing exception

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

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

if size < 0:
        raise ValueError('number must be non-negative')
Run Code Online (Sandbox Code Playgroud)

而不是简单地:

if size < 0:
        print 'number must be non-negative'
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*off 9

引发错误会在此时暂停整个程序(除非捕获到异常),而打印消息只是写了一些东西stdout- 输出可能是通过管道输送到另一个工具,或者有人可能没有从命令行运行您的应用程序,并且print可能永远不会看到输出.

例如,如果您的代码如下所示:

if size < 0:
    print 'size must be non-negative'
else:
    print size * 4
Run Code Online (Sandbox Code Playgroud)

我把你的脚本称为:

yours.py number_source.txt | sum_all_lines.sh

如果yours.py在数字之间输出纯文本,那么也许我sum_all_lines.sh会失败,因为它期待所有数字.但是,如果yours.py由于异常退出,那么sum_all_lines.sh将无法完成,并且我将清楚为什么总和失败了.

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

  • 您省略了这个:http://docs.python.org/reference/simple_stmts.html#the-raise-statement和http://docs.python.org/reference/simple_stmts.html#the-print-statement. (2认同)

Dom*_*ger 6

这取决于您是否可以size < 0size < 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"
Run Code Online (Sandbox Code Playgroud)

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

有关在Python中处理异常的更多信息,请参阅Python文档中的错误和异常教程.