Servis katmanı tüm özel istisnaları yakalamalı ve servis istisnası olarak sarmalı mı?


23

Üç katmanlı Spring web uygulamasına sahibim: dao, servis ve kontrolörler. Bir denetleyici hiçbir zaman doğrudan dao'yu çağırmaz, hizmet katmanı üzerinden yapar. Şu anda, çoğunlukla işlenmeyen bir dao istisnası (çalışma zamanı) varsa, son kullanıcıya bir hata mesajı gösteren bir JSP tarafından yakalanır. Servis katmanı tüm özel istisnaları yakalayıp bunları servis istisnaları olarak mı sarmalı?

try {
   daoInstance.someDaoMethod();
} catch(DataAccessException dae) {
   throw new ServiceException("message", dae);
}

Diyelim ki ServiceException da çalışma zamanı ve ne işlenmedi. ServiceException yerine yalnızca DataAccessException'ı atmak için herhangi bir fark var mı? Sunum katmanının veri erişim istisnası hakkında bir şey bilmemesi gerektiğini düşündüm. Ancak, sadece onları sarmak için kurtarılamaz istisnaları yakalama noktasını görmüyorum.

Yanıtlar:


18

Bence servis müşterilerinizin kim olduğu önemli bir faktör.

Hizmet katmanınız yalnızca kendi projenizdeki katmanlar arasındaki mimari bir sınır ise ve hizmet müşterisi aynı güven aleminde ise, işleri rahatlatmak için tamamdır ve denetlenmeyen istisnaların denetleyici katmanına veya hizmet istemcisine iletilmesini sağlayın.

Ancak, halka açık kod için; üçüncü taraf veya müşteri tarafından tüketilen servis, kontrol edilmeyen istisnaları, başta güvenlik kaygıları olmak üzere, ikincisi gevşek bağlantı ve temiz soyutlama için hizmet odaklı bir istisna ile sarmak daha temiz olduğunu düşünüyorum.

Bir veri katmanı istisnası hiçbir zaman, doğrudan bir web uygulamasının son kullanıcısına gidemez . Potansiyel olarak şemanız, sorgularınız, satır numarası bilgileriniz, değişken veya fonksiyon isimleriniz gibi dahili bilgiler içerir. Son kullanıcı istisnaları güvenli bir ortamda sterilize edilebilir.

Harici bir servis istemcisi, uygulama detaylarınızla ilgilenmez ve böcek veya çevre sorunları olduğu için denetlenmeyen istisnaları hiçbir şekilde kaldıramaz. Güvenli uygulamalarda veritabanı hataları OracleException - ORA-01234 - ..., eklenecek 3. tablo olabilir , ancak çoğaltmak için yeterince güvenli değildir . Müşterinin işleyebileceği kontrol edilmiş / beklenen istisnalar ile ilgilenmesine ve diğer her şeyi potansiyel bir hata raporu olarak ele almasına izin verilmelidir. Hizmet sözleşmeniz atomik, tutarlı, işlemsel bir soyutlama olmalıdır. İstisna hakkında hiçbir şey yapamıyorsa, geriye kalan tek yararlı şey size bir hata raporu vermektir.. İstisnayı günlüğe kaydetme yeteneğine zaten sahipsiniz, öyleyse neden son kullanıcınızı ayrıntılarla yüklüyorsunuz? Uygulamanız izlenebilir, böylece kullanıcılar bunları bildirmeden önce denetlenmeyen istisnalar hakkında zaten bilgi sahibi olursunuz.

İstisnaları yemekten hiçbir zaman sorun yok , kontrol edilen istisnaların hayranı değilim ama genel ürünün yapısına uygun bir plan yapmayı tercih ediyorum.


13

Hayır, DAO istisnalarını bir web uygulamasına sarmamalısınız

Sıfır fayda için kodda çok fazla gürültü var. DAO istisnaları, iyi bir nedenle denetlenmeyen istisnalardır. Uygulama kodu bir DAO istisnasından kurtulmak için yararlı bir şey yapamaz. Asıl sorun burada:

... son kullanıcıya bir hata mesajı gösteren bir JSP tarafından yakalanır.

Tüm kod tabanını kırmak yerine bu sorunu bir yerde düzeltin.

Yakalanmamış bir istisnanın kullanıcıya nasıl gösterileceğini kontrol edersiniz. Yakalanmamış istisnalar, uygulama hataları veya altta yatan sistemdeki bir arızadan kaynaklanmaktadır. Kullanıcıya isteğinin yerine getirilememe sebebi hakkında herhangi bir bilgi vermenin bir nedeni yoktur. Kullanıcının yapabileceği hiçbir şey yok. Tek yapmanız gereken arkadaşça bir hata sayfası sunmaktır.

Not: Kendinizi çok sıkıcı bir kod yazarken bulursunuz, örneğin, basitçe sarar ve tekrar atan bir avuç blok yaratırsanız, neredeyse her zaman daha iyi bir çözüm vardır.


Cevabınız için teşekkürler. Ve evet, jsp özel bir mesaj gösteriyor: "Hata! Bir şeyler ters gitti". İstisna hakkında herhangi bir bilgi göstermiyor
Oscar

7

İstisna paketlemenin kullanılmasının ana nedeni , iş katmanındaki kodun sistemdeki olası tüm istisnalar hakkında bilgi sahibi olmasını engellemektir . Bunun iki ana nedeni var:

  • Tutarlılık: bildirilen istisnalar çağrı yığınının tepesine toplanır. İstisnaları silmezseniz, bunun yerine atma yöntemlerinizi bildirerek iletirseniz, birçok farklı istisna bildiren en üst düzey yöntemlerle bitebilirsiniz. Tüm bu istisnaların her yöntemde bildirilmesi, çağrı yığınını yedeklemenin sıkıcı hale gelmesine neden olur.

  • Kapsülleme: Üst seviye bileşenlerin alt seviye bileşenler hakkında ne bir şey bildiklerini, ne de istisnalarını istemeyebilirsiniz. Örneğin, DAO arabirimlerinin ve uygulamalarının amacı, veri erişiminin ayrıntılarını uygulamanın geri kalanından uzağa soyutlamaktır. Şimdi, eğer DAO metotlarınız SQLException'ları atarsa, DAO'ları kullanan kod onları yakalamak zorunda kalacaktır. Verileri veritabanından ziyade bir web servisinden okuyan bir uygulamaya geçerseniz ne olur? O zaman DAO yöntemleri hem RemoteException hem de SQLException'ı atmak zorunda kalacak. Bir dosyadan veri okuyan bir DAO'nuz varsa, IOException'ı da atmanız gerekir. Bu, her biri kendi DAO uygulamasına bağlı olan üç farklı istisnadır.

Yani, kısacası, cevap evet!


3
JPA uygulamaları (örneğin Hazırda Bekletme) denetlenmeyen istisnalar atar. Bildirilmeleri veya yakalanmaları gerekmez.
kevin cline
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.