2013-03-11 16 views
11

Bir özel imleç sınıfındaki bir __exit__ bloğu içinden bir istisna yakalamak istiyorum, böylece daha özel bir istisna atabilirim. Bunu yapmanın doğru yolu nedir? __exit__ bloğu içinde belirli istisna RaisingBir python içinden bir istisnayı yeniden atayın __exit__ block

class Cursor: 
    def __enter__(self): 
     ... 

    def __exit__(self, ex_type, ex_val, tb): 
     if ex_type == VagueThirdPartyError: 
      # get new more specific error based on error code in ex_val and 
      # return that one in its place. 
      return False # ? 
     else: 
      return False 

kesmek gibi görünüyor, ama belki bunu düşünerek aştım.

+0

Neden özel durumu kaldırmak için bir kesmek gibi görünüyor? – NPE

+1

İçerik yöneticisi ana bloktaki herhangi bir özel durumu yakaladığından, depoladığından ve onaylamak veya veto etmek için __exit__ biçimine geçirdiğinden bunu yapmanın başka bir yolu olabileceğini düşündüm. __exit__ içinde yükselmek onun argümanlarına dayanan sorumluluklarının genişlemesinin daha çok olacağı gibi görünüyordu - ama ben bunu açıkça düşündüm. – jpredham

cevap

16

Uygun işlem, __exit__ işleyicisinin içindeki yeni istisnayı yükseltmektir.

değil, geçilen istisnayı yükseltmelisiniz; bağlam yöneticisi zincirlemesine izin vermek için, bu durumda işleyiciden bir falsey değeri döndürmeniz gerekir. Ancak, kendi istisnalarınızı yükseltmek gayet iyi. o geçti-in istisna tipini doğrulamak için kimlik testi is kullanmak daha iyidir o

Not:

def __exit__(self, ex_type, ex_val, tb): 
    if ex_type is VagueThirdPartyError: 
     if ex_val.args[0] == 'foobar': 
      raise SpecificException('Foobarred!') 

     # Not raising a new exception, but surpressing the current one: 
     if ex_val.args[0] == 'eggs-and-ham': 
      # ignore this exception 
      return True 

     if ex_val.args[0] == 'baz': 
      # re-raise this exception 
      return False 

    # No else required, the function exits and `None` is returned 

Ayrıca, belirli istisna alt sınıfları için izin vermek için issubclass(ex_type, VagueThirdPartyError) kullanabilirsiniz.

+4

Veya Muhtemelen: 'issubclass (ex_type, VagueThirdPartyError)' – mgilson

+1

** tl; dr ** Google çalışanları: özel '__exit__' istisnaları yaymıyor mu? Hiçbir şey döndürme/falsey değeri döndürme. – Qix

İlgili konular