这会有用吗?
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是不是很糟糕?即故意忽略一些不需要它们的论点?
答案 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