2010-07-08 86 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 
相關問題