嵌套异常?

时间:2010-07-08 22:47:47

标签: python

这会有用吗?

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而只传入一个arg是不是很糟糕?即故意忽略一些不需要它们的论点?

2 个答案:

答案 0 :(得分:20)

如果内部try中的filter语句引发异常,它将首先针对“except”语句的内部集合进行检查,然后如果没有捕获它,则将针对“except”的外部集合进行检查。声明。

你可以通过做这样简单的事情来说服自己就是这种情况(这只会打印“抓住价值错误”):

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

作为另一个例子,这个应该只打印“捕获内部ValueError”:

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

答案 1 :(得分:1)

补充Brent's answer,并测试另一个案例:

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