嵌套异常?

2024-04-29 13:40:30 发布

您现在位置: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,第二行会捕获它吗?

我本可以不嵌套地编写它,但第二个filter语句也可能失败!我想使用相同的ValidationError块来捕获它。

我会自己测试它,但现在这段代码是如此的交织,很难正确地绊倒它:)

顺便说一句,依赖它捕获TypeError并只传入一个arg是否不好?i、 故意省略一些不需要的论点?


Tags: selfformfalsefieldfieldsvalueargsfilter
2条回答

要称赞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

如果内部try中的filter语句引发异常,首先将对照内部的“except”语句集对其进行检查,然后如果没有一个语句捕获它,则将对照外部的“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!'

相关问题 更多 >