抛出异常与打印?

17 投票
4 回答
9069 浏览
提问于 2025-04-15 18:32

抛出异常和直接打印错误信息有什么区别呢?

比如,使用下面的代码有什么好处:

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

而不是简单地:

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

我还是个新手,请多多包涵。:)

4 个回答

3

主要的区别在于,当你进行错误检查后,程序是否会继续运行。

对于第一种情况:

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

这段代码只会把信息打印到标准输出,程序会继续执行后面的代码。所以如果在你代码的某个地方使用了 size,而它的值小于 0,你可能会遇到错误。

对于第二种情况:

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

在这种情况下,程序不会继续执行,而是会抛出一个异常。如果这个异常没有被处理,整个程序就会终止。

大多数情况下,你会希望抛出一个异常,并且有一个外部的异常处理器来捕捉这个异常,告诉用户发生了什么错误,并且如果可能的话,允许他们重新输入。

6

这要看你能不能在发现 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 文档中的 错误和异常教程

13

抛出错误会让整个程序在那一刻停止运行(除非这个错误被捕获),而打印信息只是把内容写到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就不会完成,这样我就能清楚地知道为什么求和失败了。

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

撰写回答