嵌套异常?
这个代码能正常工作吗?
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!'