嵌套异常?

18 投票
2 回答
30281 浏览
提问于 2025-04-16 01:01

这个代码能正常工作吗?

try:
    try:
        field.value = filter(field.value, fields=self.fields, form=self, field=field)
    except TypeError:
        field.value = filter(field.value)
except ValidationError, e:
    field.errors += e.args
    field.value = revert
    valid = False
    break              

也就是说,如果第一行代码抛出了一个 ValidationError,那么第二个 except 会捕捉到这个错误吗?

我本来想把它写得不那么嵌套,但第二个过滤条件也可能出错!我想用同一个 ValidationError 的处理块来捕捉这个错误。

我自己想测试一下,但这个代码现在交织得太复杂了,难以正确触发错误 :)

顺便问一下,依赖它捕捉 TypeError 并只传入一个参数,这样做是不是不好?也就是说,故意省略一些不需要的参数?

2 个回答

3

为了补充一下Brent的回答,我们来测试另一种情况:

class ValidationError(Exception): pass
def f(a): raise ValidationError()

try:
    try:
        f()
    except TypeError:
        f(1)
except ValidationError:
    print 'caught1'

try:
    try:
        f(1)
    except TypeError:
        print 'oops'
except ValidationError:
    print 'caught2'

这段代码会输出:

caught1
caught2
27

如果内层的尝试(try)中有过滤条件出现了错误,它会先去检查内层的“异常处理”(except)语句。如果内层的异常处理没有捕捉到这个错误,接着它会去检查外层的“异常处理”语句。

你可以通过做一些简单的实验来验证这一点,比如这样做(这段代码只会打印“捕获到值错误”):

try:
    try:
        raise ValueError('1')
    except TypeError:
        print 'Caught the type error'
except ValueError:
    print 'Caught the value error!'

再举个例子,这段代码应该只会打印“捕获到内层的值错误”:

try:
    try:
        raise ValueError('1')
    except TypeError:
        pass
    except ValueError:
        print 'Caught the inner ValueError!'
except ValueError:
    print 'Caught the outer value error!'

撰写回答