为什么这个异常不打印0?

时间:2015-02-04 07:02:25

标签: python exception

try:
    try:
        raise Exception('0')
    finally:
        print 1/0
except Exception, e:
    print e

它只打印出"整数除法或模数为零"。代码运行时的步骤是什么?

3 个答案:

答案 0 :(得分:5)

当存在finally子句时,无论您如何离开正文,即执行异常或return语句,都会执行代码。

如果在finally的正文期间出现异常,则此新异常会替换原始异常,这就是为什么您获得的错误大约是1/0而不是原来的错误异常。

您可以阅读有关处理错误和例外的更多信息in the official documentation on "defining clean-up actions"

答案 1 :(得分:0)

为什么此例外不会打印0? 因为异常来自语句finally

中的print 1/0
  1. 在离开try语句之前始终执行finally子句,无论是否发生了异常。
    1. raise语句允许程序员强制发生指定的异常。
  2. 我在这个例子中添加了print语句:

    代码:

    try:
        try:
            print "befor--raise"
            raise Exception('0')
            print "after--raise"
        finally:
            print "in finally"
            print 1/0
    except Exception, e:
        print "In main Exception"
        print e
    
    
    print "---------"
    
    try:
        try:
            print "befor--raise"
            raise Exception('0')
            print "after--raise"
        finally:
            print "in finally"
            print 1/1
    except Exception, e:
        print "In main Exception"
        print e
    

    输出:

    ~$ python  test.py
    befor--raise
    in finally
    In main Exception
    integer division or modulo by zero
    ---------
    befor--raise
    in finally
    1
    In main Exception
    0
    

答案 2 :(得分:0)

因为您raise Exception('0'),但没有处理它,当代码转到finally时,它会引发一个除外except之外的异常,如果您尝试这种方式会看到0:

try:
    try:
        raise Exception('0')
    except Exception, error:
        print error
    finally:
        print 1/0
except Exception, e:
    print e

输出:

0
integer division or modulo by zero