İstisnaların Ayrıntı Düzeyi


9

Birkaç arkadaş ve ben arasında bir tartışmaya girdim. İstisna alanları gibi ayrıntılarla ClientErrorExceptionve ServerErrorExceptionayrıntılarla genel istisnaları tercih ederken, işleri daha spesifik hale getirmeyi tercih ediyorum. Örneğin, aşağıdaki gibi bir avuç istisna olabilir:

  • BadRequestException
  • AuthenticationFailureException
  • ProductNotFoundException

Bunların her biri API'dan döndürülen hata koduna dayanarak oluşturulmuştur.

İstisnaların Avantajları sonrasında bu Java için deyimsel görünmektedir. Ancak, arkadaşlarımın görüşü tam olarak nadir değildir.

Kod okunabilirliği ve API kullanılabilirliği açısından tercih edilen bir yol var mı, yoksa gerçekten tercih mi?


Bağlı sayfasında muhtemelen en iyisidir kesin alabileceğimiz cevap. Gerçekten bir fikir istiyorsun. Deneyim ve düşüncelerimin ne olduğunu cevaplayabilirim, ama bu objektif bir cevap değil.
marstato

@ marstato bu adil. Sanırım benim pozisyonumda bir tür gerekçe arıyorum. İnsanların yazdığım kütüphanelerde beklediklerine devam etmeyi tercih ederim, eğer eşyalarımı kullanmayı kolaylaştırıyorsa, bir kılavuzu takip etmek yerine, biliyor musunuz?

Kesinlikle katılıyorum. İstisna sınıflarım da parçalı. Ayrıca, abstractalıcı yöntemleri ile istisna sınıflarını tanımlayabilir ve genelleştirebilir ve sonra ayrıntılı olanları genel olanları genişletebilirsiniz. Örn AuthenticationFaliureException extends ClientErrorException. Bu şekilde, her kullanıcı istisnalarla nasıl başa çıkmak istediklerini seçebilir. Açıkçası, daha fazla işe yarıyor. Ancak, bir uygulama yazarken (kütüphane yerine), bu farklı bir durum IMHO'dur. Bu durumda, basitlik uğruna, istisnaları ihtiyacınız olandan daha ayrıntılı yapmam.
marstato

@marstato aslında bunu şu şekilde uyguluyorum. Kabul ettiğine sevindim. Soruyu gece boyunca açık bırakacağım, ancak en azından yeşil kontrol edebilmem için lütfen bunu bir

Yanıtlar:


15

Birçok farklı istisna sınıfına sahip olmak ve hata metninde daha ayrıntılı bilgiler içeren sadece birkaçına sahip olmak arasındaki temel fark (örneğin), birçok farklı istisna sınıfının, çağrı kodunun farklı türdeki hatalara farklı tepki vermesine izin vermesidir. sadece birkaç sınıf her türlü istisnayı aynı şekilde ele almayı kolaylaştırır.

Bu genellikle bir ödünleşmedir. Kalıtım kullanarak bir dereceye kadar hafifletilebilir (her şeyi genel olarak yakalamak ve kaydetmek isteyen arayanlar için genel bir temel istisna sınıfı ve farklı tepkilere ihtiyaç duyan arayanlar için bu temel sınıftan istisnalar türetilebilir), ancak bu bir dikkatli olmamanız ve YAGNI prensibine bağlı kalmamanız durumunda çok fazla karmaşıklık. Bu yüzden yol gösterici soru burada olmalı:

  • Kodunuzun arayanının bu tür hatalara farklı kontrol akışı ile farklı tepki vermesini gerçekten bekliyor musunuz?

Bunun için tek bedene uyan bir çözüm yok, her yere uygulayabileceğiniz cesur "en iyi uygulama" yok. Bu sorunun cevabı büyük ölçüde ne tür bir yazılım veya bileşen tasarladığınıza bağlıdır:

  • sizin veya ekibinizin tüm kod tabanı kontrolünüz altında olduğu bazı uygulamalar?

  • veya tüm potansiyel arayanları bilmediğiniz üçüncü taraflar için yeniden kullanılabilir bir bileşen mi?

  • Farklı tür hataların tüm sistemi derhal kırmaması ve farklı türde hata azaltma gerektirebilecek uzun süredir çalışan bir sunucu uygulaması?

  • bir hata durumunda kullanıcıya bir hata mesajı görüntülemenin ve daha sonra işlemi yeniden başlatmanın yeterli olduğu kısa ömürlü bir uygulama işlemi?

Bileşeninizin potansiyel arayanları hakkında ne kadar fazla bilgi sahibi olursanız, istisnalarınız için doğru ayrıntı düzeyi hakkında daha iyi karar verebilirsiniz.


3
"Kodunuzun arayanının, farklı kontrol akışıyla, bu tür hatalara farklı tepki vermesini gerçekten bekliyor musunuz?" bu harika bir soru. Teşekkür ederim, bunu hatırlayacağım.

Bu iyi bir cevap olduğunu düşünüyorum, sadece istemci uygulama istisna fırlatma tasarım sürücü izin ihtiyacını daha fazla vurgulamak istiyorum. İstisna hiyerarşisinde yerleşik olduğunu düşündüğünüz genellemeler bile, istemci uygulamanızın (kendiniz yazmıyorsa) bir işleyiciyi genelleştirmeyi seçebileceği yollarla eşleşmeyebilir. Farklı ihtiyaçları olan birden fazla istemci uygulamanız varsa, elbette bunları dengelemek size kalmış olacaktır.
magicduncan

1

Cevap, bahsettiğimiz hata raporlama düzeyine bağlıdır.

Genel olarak arkadaşlarınızla aynı fikirdeyim, onları sorunun nedenini anlatmak için gerekenden daha ayrıntılı yapmamalısınız.

Null değerine (NullReferenceException) başvurmak için yaygın olarak bilinen iyi bir özel durum varsa, kendi MyObjectIsNullException özel durumunuzu oluşturmamalısınız. Bu sadece insan tercümanı için bir karışıklık katmanı ekleyecektir, öğrenecek ek bir şey, hiçbir şeyi netleştirmez.

Sadece istisnanız, kök nedenini kapsayan önceden tanımlanmış bir tane olmadığı kadar özel olduğunda, kendinizinkini oluşturmalısınız.

Ancak, orada durmak zorunda değilsiniz. Yaygın hata da bileşenlerinden biri oluşabilir ve bir sorun olduğunu iletmek isteyebilirsiniz sizin bileşende . Yani sadece neyin yanlış gittiğini değil, aynı zamanda nerede olduğunu. Sonra ilk istisnayı bir MyComponentException içine sarmak uygun olacaktır. Bu size her iki dünyanın en iyisini verecektir.

Öncelikle, bileşenin belada olduğu açık olacak. Daha düşük bir kolda, spesifik neden iç istisnada olacaktır.


Bu adil. Yani iyi bir tane zaten mevcut olduğunda yeni bir istisna icat etmemenizi mi öneriyorsunuz?

@rec Evet, çünkü herkes önceden tanımlanmış olanları zaten biliyor. Bunun için oradalar.
Martin Maat
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.