代码之家  ›  专栏  ›  技术社区  ›  eozzy

引发异常与打印?

  •  9
  • eozzy  · 技术社区  · 16 年前

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

    例如,使用以下功能有什么好处:

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

    而不是简单地:

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

    我是个新手,请你放心。:)

    4 回复  |  直到 16 年前
        1
  •  8
  •   Mark Rushakoff    16 年前

    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 将失败,因为它期望所有数字。但是,如果 Y.Py 由于异常退出,然后 总结所有行.sh 不会结束的,我很清楚为什么总数会失败。

    当然,这只是一个例子,您的特定案例可能完全不同。

        2
  •  6
  •   Dominic Rodger    16 年前

    这要看你能不能应付 size < 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中处理异常的更多信息,请查看 Errors and Exceptions tutorial 在python文档中。

        3
  •  3
  •   Richie    16 年前

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

    里奇……

        4
  •  2
  •   Tendayi Mawushe    16 年前

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

    对于这种情况:

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

    这将把消息打印到标准输出,程序将继续通过您的检查。因此,如果在稍后的某个时候在代码中使用 size 更不用说 0 可能会出错。

    对于另一种情况:

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

    在这种情况下,程序将无法继续通过检查,将引发异常。如果不处理,整个程序将终止。

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

    推荐文章