2011-10-10 25 views
9

Python'daki farklı istisna türleriyle çalışırken, kod çoğaltmasını önlemek için iyi bir örnek nedir? Ben ve httpError simlar ama oldukça UrlError tedavi etmek istiyorum:Python: Özel durum yakalamada kod çoğaltmanın nasıl önlenir?

try: 
    page = urlopen(request) 
except URLError, err: 
    logger.error("An error ocurred %s", err) 
except HTTPError, err: 
    logger.error("An error occured %s", err) 
    logger.error("Error message: %s", err.read()) 

Bu örnekte, ilk logger.error çağrısı tekrarını önlemek istiyorum. Verilen UrlError httpError ebeveyni biri böyle bir şey yapabileceğini geçerli:

except URLError, err: 
    logger.error("An error occurred %s", err) 
    try: 
     raise err 
    except HTTPError, err: 
     # specialization for http errors 
     logger.error("Error message: %s", err.read()) 
    except: 
     pass 

başka bir yaklaşım isinstance örn kullanmak olacaktır. UrlError ve httpError miras zinciri içinde olmaz ise: Biri ben tercih etmeliyiz

except (URLError, HTTPError), err: 
    logger.error("An error occured %s", err) 
    if isinstance(err, HTTPError): 
     logger.error("Error message: %s", err.read()) 

, başka daha iyi bir yaklaşım var mı?

cevap

10

Üçüncü örneğinizin en iyi çözüm olduğunu düşünüyorum.

  • It çoğaltılması önler kısa versiyonu
  • var
  • Okumak net ve ikinci versiyonunda aksine çok takip etmek kolaydır.

Sen Python 2.6 veya daha yüksek iseniz, olsa da, yeni except FooError as err sözdizimi kullanmak isteyebilirsiniz. Ayrıca, örnekte, URLError işleyicisi zaten HTTPError yakaladığından, ilk sürümde doğru değil, bu nedenle except HTTPError bölümüne asla ulaşılamıyor. Üste | Geri Bildirim Ver Daha fazla bilgi Daha fazla bilgi edininİki except s'yi değiştirmelisiniz. Bunu kullanmamanın başka bir nedeni.

+0

Teşekkürler Tim! Bu inandırıcı. İlk örnekte URLError, HTTPError siparişini tespit ettiniz. Sorunu, örneğinizde sorunun cevabında belirttiğiniz gibi açıkça belirttiği gibi düzenlemiyorum. – Bernhard

İlgili konular