2013-04-20 18 views
16

Bir istisna hariç tümü nasıl ele alınır?Hepsini bir istisna dışında işleme

try: 
    ... 
except SomeException: 
    raise 
except: 
    ... 

raise herhangi bir ifade olmaksızın sonra olacak basit zam son atılan istisna (o halledildi bile!):

try: 
    something 
except NoChildException: 
    raise NoChildException 
except: 
    pass 
+4

Basit cevap: Yapma. Tüm istisnaları yakalamak gerçekten çok kötü bir uygulamadır, zira yapmak istemediğinizleri yakalamaya meyilli olacaksınız, hataları düzeltmek. Böyle bir şey yapmak için sadece az sayıda meşru dava var. –

+2

Kendi sorunuza cevap vermiş görünüyorsunuz. Bize niçin sahip olduğunuzdan memnun olmadığınızı söyleyin. –

+0

@ Robᵩ Oldukça, onun örneği bir * yeni * istisna yapacak, eskisini yeniden yükseltmeyecek. –

cevap

24

cevap basitçe raise yapmaktır. Bu kabaca eşdeğer: Başka bir istisna (bu durumda tabii ki imkansız) catch bloğunda atılan olabileceğini düşünüyorsanız

except SomeException as e: 
    raise e 

, doğru istisnayı tekrar yükseltmek sağlamak için ikinci biçimini kullanmalısınız.

Ancak benim açıklamada belirtildiği gibi:

Basit cevap: Yapma. istisnalarını yakalamak gerçekten kötü bir uygulamadır, aksi halde, engelleme hatalarını yakalamadıklarını yakalamaya çalışacaksınız. için böyle bir şey yapan çok az sayıda meşru dava var.

Sadece kodunuzu atmak düşünüyorum hataları yakalamak ve nasıl işleneceğini biliyor ve buna benzer başka bırakın. Başka herhangi bir şey olursa, programınız çıkacaktır - ne istiyorsun, niçin gerçekleştiğini ve doğru şekilde işlediğini görebilirsiniz.

+2

+1 "yapma" – Aya

+0

kabul ediyorum. Ancak şunu anlıyorum: Hata: Patient.update yönteminiz, olması gerekmediğinde ZeroDivisionError türünde bir istisna yakaladı. Kodunuzda çıplak 'except' cümleleri kullanmamalısınız. Sadece yükseltilmiş NoChildExceptions yakalamak. Bu yerine : Çeşidi Başarıyla göz ardı kaldırdı istisna: ZeroDivisionError Çeşidi Başarıyla göz ardı kaldırdı istisna: NameError Çeşidi Başarıyla göz ardı kaldırdı istisna: AttributeError Çeşidi Başarıyla göz ardı kaldırdı istisna: TypeError Çeşidi Başarıyla göz ardı kaldırdı istisna : ValueError Başarılı bir şekilde yakalandı NoChildException Test Tamamlandı –

+0

@ IvanVulović Bu yüzden ne isterseniz * sadece * NoChildException '(ne sorduğunuzun tam tersi) yakalamak, yani sadece şunu deneyin: ... NoChildException: ... ', hiçbir şey fantezi için gerek yok. –

2

Bunu kabul edilen cevapta bir gelişme olarak önerebilirim. Bu yaklaşım MySpecialException yakalandığı zaman orijinal stacktrace koruyarak, bu nedenle üst düzey istisna işleyicisi istisna açtığında özgün özel durum nereye işaret eden bir Traceback alırsınız tarafından kabul edilen cevap geliştirir

try: 
    dosomestuff() 
except MySpecialException: 
    ttype, value, traceback = sys.exc_info() 
    raise ttype, value, traceback 
except Exception as e: 
    mse = convert_to_myspecialexception_with_local_context(e, context) 
    raise mse 

.

0

Tüm hataları yakalamanın, ancak kötü bir şey olmadığını, yani birim sınamasının yapılmasını sağlayan bir içerik buldum.

Ben bir yöntemi varsa: şimdi tespit ettik Çünkü

def test_my_method(): 
    try: 
     my_module.my_method() 
    except IOError, e: 
     print "shouldn't see this error message" 
     assert False 
    except Exception, e: 
     print "some other error message" 
     assert False 
    assert True 

o my_method sadece beklenmedik bir istisnaya neden oldu:

def my_method(): 
    try: 
     something() 
    except IOError, e: 
     handle_it() 

Sonra AB'yi gibi görünen bir birim testi olabilir.

İlgili konular