2015-10-19 16 views
5

Eğer (özel) yakalanmış bir istisnayı yeniden yükseltebilir ve aynı denemenin dışında bir daha (genel) tarafından yakalanabileceğini merak ediyordum. Örnek olarak, belirli bir IOError ile bir şey yapmak istiyorum, ancak beklenen IOError değilse, istisna başka bir hata gibi ele alınmalıdır. Başlangıçta çalıştı Ne:Python 'hariç' fall-through

try: 
    raise IOError() 
except IOError as ioerr: 
    if ioerr.errno == errno.ENOENT: 
     # do something with the expected err 
    else: 
     # continue with the try-except - should be handled like any other error 
     raise 
except Exception as ex: 
    # general error handling code 

Ancak bu işe yaramazsa: zam denemede-haricinde bağlamı dışında istisna yeniden yükseltir. İstenilen istisna 'düşme' davranışı için bunu yazmanın pythonik yolu ne olurdu?

(farkında olduğunu ediyorum önerilen bir bu çözdük olabilecek şekilde, bu uygulamaya konmadı 'hariç şartlı') Ben pythonically yazılı uzman değilim, ama bir bariz bir yaklaşım düşünüyorum

+1

Bu nedenle, 'Exception' bloğu dışında 'IOError' bloğundan 'exception' bloğundan çıkmak isteyebilirsiniz? Bu mümkün olmadığını bildiğim kadarıyla, sadece bir 'except' bloğu (veya 'else' bloğu) verilen bir' try' için çalışır. Her şeyi başka bir şeyle sarmayı başarabilirdiniz, yani 'İstisna hariç' içini kaldırarak, yani bütünüyle ele alınacak olan 'IOError' kelimesi dışardan 'try''s 'except's. – jonrsharpe

+0

Yapmak istediğim şey bu, ve tek istisnanın mümkün olabileceği konusunda endişeliydim. İç içe geçmiş/kod çoğaltma gibi bir şey daha zarif bir çözüm umuyoruz – OverlordAlex

cevap

1

(siz) Eğer istisna belirli bir tür bekliyorsanız olduğunu biliyorsanız, iç içe durum işleme kullanmak üzere olacaktır:

try: 
    try: 
     raise IOError() 
    except IOError as ioerr: 
     if ioerr.errno == errno.ENOENT: 
      # do something with the expected err 
     else: 
      # pass this on to higher up exception handling 
      raise 

except Exception as ex: 
    # general error handling code 

ben yorumunuzda biliyorum iç içe başka istemediğini - bilmiyorum İç içe istisna işleme, kitabınızda kötü ise, ancak en azından kod çoğaltmasını önleyebilirsiniz.

+0

Bu harika bir yaklaşım, gördüğünüzde gerçekten belirgin görünüyor. Çok güzel bir fikir! – iFreilicht

1

Yani, burada aynı şekilde çalışıyorum ve mevcut çözümleri gözden geçirdikten sonra, ebeveyn istisnasının yakalanması ve daha sonra spesifikasyonların test edilmesiyle gideceğim. Benim durumumda dns modülü ile çalışıyorum.

try: 
    answer = self._resolver.query(name, 'NS') 
except dns.exception.DNSException, e: #Superclass of exceptions tested for 
    if isinstance(e, dns.resolver.NXDOMAIN): 
     #Do Stuff 
    elif isinstance(e, dns.resolver.NoAnswer): 
     # Do other stuff 
    else: 
     # Do default stuff