Discuss / Python / 为什么用raise再次抛出错误后,之前的print('ValueError!') 没有显示?

为什么用raise再次抛出错误后,之前的print('ValueError!') 没有显示?

Topic source

关于下面代码我有两个问题:

def foo(s):
    n = int(s)
    if n == 0:
        raise ValueError('invalid value: {}'.format(s))
    return 10 / n

def bar():
    try:
        foo('0')
    except ValueError as e:
        print('ValueError!')
        raise


bar()

第一个问题: bar()被调用的时候,foo在内部被调用,在foo的内部抛出了一个ValueError错误的同时显示了‘ValueError: invalid value: 0’,然后这个错误在外部的bar()中被捕获了。 那么我的问题是,虽然在bar()中,ValueError被捕获后又抛出,但为什么print('ValueError!')没有显示出来,它应该是在捕获foo()中的ValueError后,就会被执行然后再执行raise抛出不是吗? 第二个问题: 当我把bar()里面的raise注释掉了以后,这段代码的执行结果就是简单的一句ValueError!,代码的执行不应该是先调用bar(),然后在foo()里面抛出ValueError同时显示‘ValueError: invalid value: 0’,然后在外部被except截获之后才显示ValueError!才对吗?

希望有朋友为我解释一下。

郭翼藤

#2 Created at ... [Delete] [Delete and Lock User]

第一个问题,我这边有“ValueError!”显示的。 关于第二个问题,因为在外面那个函数当中你把问题给捕获了(except),所以编译器就不会报错给你那个traceback。 所以在外面函数except中那个raise的目的就是,就算捕获了,但是不会处理,所以继续把错误网上丢

几天忙忘了看。 第一个问题是我自己没有看到。 第二个问题:如果外层捕获到exception,内层的raise就不会显示信息。除非外部再次抛出。 多谢!

楽神_

#4 Created at ... [Delete] [Delete and Lock User]

对于第二个问题,我的认为的是在bar()中把raise注释后,虽然此时bar()中捕获到了foo()抛出的异常,但是只做了print('ValueError!')操作,并没有继续把错误往上抛出,这样外部就会认为这个异常被bar()自己处理掉了。所以不会打印foo()中的错误信息,如果不注释raise,那就理解为bar()本身没有能力处理这个异常,继续抛出给自己的上级,因为上级没有东西了,所以就在运行结果中抛出来显示了。

感谢,理解了。发生错误后外层exception直接捕获,有空raise,则往上丢错误,即往内层丢,无空raise,则不会


  • 1

Reply