2010-07-08 80 views
8

这项工作?嵌套异常?

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

您不必在原地测试代码。创建一个新的python脚本将非常简单,只需将其粘贴到您想要测试该行为的异常提升行中即可。 – 2010-07-08 22:54:45

+0

@Anon:你是对的......我想比实验要容易得多。 – mpen 2010-07-08 23:04:05

回答

17

如果内部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

哦...现在你添加了另一个案例。会说...必须等一会儿才能接受你。 (哈哈......“你可以在0秒内接受这个答案” - 什么时间安排!) – mpen 2010-07-08 23:01:26

+0

我第一次用“提交”按钮过度了;-) – 2010-07-08 23:06:36

0

恭维布伦特的答案,并测试另一种情况:

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 
相关问题