2010-07-08 43 views
8

Bu işe yarar mı?İç içe istisnalar mı?

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    

Yani, o ilk satırı ValidationError, irade ikinci except yakalamak o atarsa?

Bunu yuvalanmamış olarak yazabilirdim, ancak ikinci filtre deyimi de başarısız olabilir! Ve ben de onu yakalamak için aynı ValidationError bloğunu kullanmak istiyorum.

Kendim sınamak istiyorum, ama bu kod o kadar iç içe geçmiş olduğunu şimdi düzgün yolculuk :) Bir yan not olarak

zor

, kötü o TypeError yakalayıp tek geçen temel almaktır arg yerine? yani, ihtiyaç duyulmayan bazı argümanları kasıtlı olarak atlatmak mı?

+2

Kodu yerinde test etmek zorunda değilsiniz. Yeni bir python betiği oluşturmak oldukça kolay olurdu ve sadece bu davranışı test etmek istediğiniz istisnai bir yükselme çizgisine bağlı kalın. –

+0

@Anon: Haklısın ... Sanırım deneyimi düşündüğümden daha kolay. – mpen

cevap

17

İç denemedeki filtre ifadesi bir istisna kaldırırsa, önce iç "özel" ifadelerine karşı kontrol edilir ve ardından bunlardan hiçbiri yakalanmazsa, dış kümesine karşı kontrol edilir. "ifadeler.

Bunun sadece böyle basit bir şey yaparak durumda (bu yalnızca baskı "değeri hatasını yakalandı" olacaktır) 'dir kendinizi ikna edebilir: Başka bir örnek olarak

try: 
    try: 
     raise ValueError('1') 
    except TypeError: 
     print 'Caught the type error' 
except ValueError: 
    print 'Caught the value error!' 

, bu bir baskı "yakalandı olmalıdır sadece iç 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

Oh ... şimdi diğer davayı eklediniz. Söyleyeceklerim ... seni kabul etmek için bir dakika beklemek zorunda. (haha ... "bu cevabı 0 saniyede kabul edebilirsiniz" - zamanlama!) – mpen

+0

İlk kez "Gönder" düğmesiyle çok eğleniyorum ;-) –

0

Brent cevabı iltifat ve diğer durumda test etmek için:

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' 

İçindekiler:

caught1 
caught2