嵌套异常?
这项工作?嵌套异常?
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来代替?即故意忽略一些不需要的论点?
如果内部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!'
哦...现在你添加了另一个案例。会说...必须等一会儿才能接受你。 (哈哈......“你可以在0秒内接受这个答案” - 什么时间安排!) – mpen 2010-07-08 23:01:26
我第一次用“提交”按钮过度了;-) – 2010-07-08 23:06:36
恭维布伦特的答案,并测试另一种情况:
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
您不必在原地测试代码。创建一个新的python脚本将非常简单,只需将其粘贴到您想要测试该行为的异常提升行中即可。 – 2010-07-08 22:54:45
@Anon:你是对的......我想比实验要容易得多。 – mpen 2010-07-08 23:04:05