Eric Lippert'in istisnalar hakkındaki makalesini okumak , hem üretici hem de tüketici olarak istisnalara nasıl yaklaşmam gerektiği konusunda kesinlikle bir göz açıcıydı. Bununla birlikte, hala rahatsız edici istisnalar atmamaktan kaçınmak için bir kılavuz tanımlamakta zorlanıyorum.
özellikle:
- Başarısız olabilecek bir Kaydet yöntemine sahip olduğunuzu varsayalım, çünkü a) Başkası kaydı sizden önce değiştirdi veya b) Oluşturmaya çalıştığınız değer zaten var . Bu şartlar beklenir ve istisnai değildir, bu nedenle bir istisna atmak yerine, kaydetmenin başarılı olup olmadığını belirten bir boolean döndüren yönteminizin TrySave sürümünü deneyin. Ancak başarısız olursa, tüketici sorunun ne olduğunu nasıl bilecek? Yoksa sonucu belirten bir numara döndürmek en iyisidir, ne tür bir Ok / RecordAlreadyModified / ValueAlreadyExists? İnteger.TryParse ile bu problem mevcut değildir, çünkü yöntemin başarısız olmasının tek bir nedeni vardır.
- Önceki örnek gerçekten sinir bozucu bir durum mu? Yoksa bu durumda bir istisna atmak tercih edilen yol olabilir mi? Entity çerçevesi de dahil olmak üzere çoğu kütüphanede ve çerçevede böyle yapıldığını biliyorum.
- Yöntemin çalışıp çalışmadığını önceden test etmek için bir yöntem sağlayarak, yönteminizin bir Dene sürümünü ne zaman oluşturacağınıza nasıl karar verirsiniz? Şu anda bu yönergeleri takip ediyorum:
- Bir yarış koşulu olasılığı varsa, bir Dene sürümü oluşturun. Bu, tüketicinin dışsal bir istisna yakalama ihtiyacını önler. Örneğin, daha önce açıklanan Kaydet yönteminde.
- Durumu test etme yöntemi, orijinal yöntemin yaptığı her şeyi yaparsa, bir Try sürümü oluşturun. Örneğin, integer.TryParse ().
- Başka bir durumda, durumu test etmek için bir yöntem oluşturun.