Python'da bir istisnayı ne zaman alt sınıflamalıyım?


10

Kodumda bir istisna getirdiğim yaklaşık yedi yer var. Tüm bu istisnalar aynı şekilde ele alınır: günlük dosyasına bir hata yazdırın, yazılım durumunu varsayılana döndürün ve çıkın.

Kod incelemesi sırasında çok değer verdiğim kıdemli mühendisim, tüm bu istisnaları alt sınıfta tutmam gerektiğini söyledi. Onun argümanı gelecekte istisnaları farklı ele almak isteyebiliriz ve bu daha kolay olacaktır.

Benim iddiam şu anda sadece kodumuzu karmaşıklaştıracak ve istisnaları farklı şekilde ele alıp almayacağımızı bilmediğimiz için, kodu ters bırakmalıyız ve eğer zaman gelirse ve sonra, o zaman ve sadece o zaman alt tip yapmalıyız .

Her dava için herhangi bir argüman duymak istiyorum.


2
YAGNI ... Şimdi buna ihtiyacınız yok ve daha sonra çok fazla zorluk çekmeden ekleyebilirsiniz.
Robert Harvey

Hiç örneğin var mı? ExceptionÖrneğin, sadece veya daha spesifik yerleşik hataları mı yükseltiyorsunuz ?
jonrsharpe

sadece bir İstisna yükseltme ("özel açıklama")
Ezra

@Ezra, en azından daha uygun bir yerleşik istisna olup olmadığını görmelisiniz (bkz. Docs.python.org/2/library/exceptions.html ).
jonrsharpe

Yanıtlar:


8

Haklısın

Tarafınızla ilgili argüman Robert Harvey tarafından zaten belirtilmiştir: şu anda ihtiyacınız olmayan kodu eklemeyin, özellikle daha sonra eklemek kolay olduğundan.

Yorumcunuz da haklı

Öte yandan, gözden geçirenin noktası da anlaşılabilir:

  • Bir jenerik döndürmek Exception()arayan kişi için çok yararlı değildir: istisna açıklaması bir insana neler olduğunu gösterirken, istisnaları programlı olarak farklı şekilde ele almak imkansız olabilir. Kodunuzu kullanan geliştirici , bir şeyi kırma korkusu (haklı veya yanlış) da dahil olmak üzere istisna türlerini değiştirmek konusunda isteksiz olabilir .

    Not Şu anda özel durumlar eklemek değil zor olduğunu :

    class MyCustomException(Exception):
        pass

    tüm ihtiyacın olan. Bu sadece iki satırlık koddur (bir dosyaya özel istisnalar koyarsanız ayrı bir dosya oluşturmanız gerekmeyebileceği göz önüne alındığında).

  • Kodun kendisi daha iyi, daha okunabilir görünüyor.

    if price < self.PriceMinValue:
        raise OutOfRangeException("The price is inferior to zero.")

    ile karşılaştırıldığında biraz daha okunabilir görünüyor:

    if price < self.PriceMinValue:
        raise Exception("The price is inferior to zero.")

    istisna türünün belirtilmesi nedeniyle:

    • İkinci kod parçasında, açıklamayı okumalı ve fiyatın aralık dışında olduğunu tahmin etmeliyim (ya da belki değil mi? Belki fiyatların indirimler gibi olumsuz olabileceği durumlar vardır?)

    • İlk kodda, türün üzerine bir bakış, hata hakkında hemen bir belirti verir. Bir fiyat için izin verilen değerler kümesi var ve geçerli değer bu kümenin dışında.

Yani?

Yani:

  • Her iki yaklaşım da geçerlidir. Özel türlere ihtiyacınız olmadığında istisnaları alt sınıfta tutmazsanız, haklısınız. İstisnaları alt sınıf yaptığınızda, bunun hiçbir maliyeti yoktur ve daha sonra faydalı olabilir, haklısınız.

  • Ekibinizle tutarlı olun. Ekibiniz özel istisnaları yoğun bir şekilde kullanıyorsa, bunları kullanın.


2
Ama güzel bir ortam vardır: raise ValueError('The price is less than zero'). Bu, tabandan daha belirgindir Exception, ancak herhangi bir karışıklık olmadan.
jonrsharpe

Basit ifadesi için +1, "tutarlı olun", eğer varsa bir ekiple, yoksa kendinizle.
Styne666
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.