2010-01-26 10 views
7

Standart 3 katmanlı ASP.NET web uygulamasını yapıyorum, ancak belirli şeylerin nerede yapıldığı konusunda mücadele ediyorum - özellikle istisnaları ele alma.3 katmanlı bir web uygulamasındaki istisnalar nasıl ve nerede kullanılır? Spesifik olarak Sql Veri Tabanı İstisnaları

bazı örnekler için web üzerinde bir göz etrafında olması denedim ancak birlikte her şey nasıl bağlantılarını gösteren bir projenin tamamı kadar uzanıyor hangi herhangi bulamıyorum.

Veri katmanımda SQL Server'a bağlanıyorum ve bazı şeyler yapıyorum. Sonuç olarak yükseltilebilecek istisnaları yakalamam gerektiğini biliyorum ama nerede yapacağımı bilmiyorum. Ben UI katmanı bunu yapıyor olmalı ama bu durumda ben veritabanı bağlantısı kapatıldı emin olmak için nasıl emin değilim okuduğum kadarıyla

. Bunu nasıl yapacağını açıklayabilecek biri var mı? Ayrıca, herhangi biri, 3 boyutlu bir web uygulaması bulabileceğimiz en iyi uygulamaları takip eden bir uygulama bulabilir.

teşekkürler düşünme yönlendirmek olabilir Sadece bir yan noktası

cevap

6

Başarıyı garantileyen kolay yanıtlar veya modeller yoktur. Sadece validasyon stratejiniz gibi, tam istisna işleme stratejiniz tam durumunuza özgüdür ve genellikle zaman ve kapsamlılık arasında bir değiş tokuş olur. Bununla birlikte verebileceğimiz bazı iyi tavsiyeler var:

  • Yığın izini hiçbir zaman gizlemeyin; Güvenlik nedeniyle, ne olduğunu gizlemek istemediğiniz sürece "Rethrow" kullanmayın.
  • Her yerde hataya ihtiyacınız olduğunu düşünmüyorum. Varsayılan olarak, alt katmanlarınızda, gerçek hatanın en üst katmana kadar sızmasını sağlamak kötü değildir.UI/Denetleyici, yanlış giden bir şeye nasıl tepki vereceğinize gerçekten karar vermeniz gereken yerdir. Her noktada
  • , kendinizi tam olarak herhangi bir sorun olması durumunda ne ne istediğiniz gibi. Çoğu zaman, en üst katmana hatta istemci makineye kadar gitmesine izin vermekten daha iyi bir şey düşünemezsiniz. (üretimde ayrıntılı raporlar olsa da.) Bu durumda, bırak gitsin.
  • Yönetilmeyen kaynakları (IDisposable uygulayan her şeyi) attığınızdan emin olun. Veri erişiminiz harika bir örnektir. Ya (A) Nihayet blokta vb (özellikle) bağlantısı, komut, datareader için .Dispose() ara yoksa (B) doğru atılması olur emin olur Using Syntax/Pattern kullanın.
  • Hataların muhtemel olduğu ve belirli hataları arayabileceğiniz yerleri arayın (tepki vererek, yeniden deneme yaparak, ikinci bir yeniden denemeyi beklerken, bu eylemi farklı bir şekilde denerken, vb.) Ve umarız başarabilirsiniz. İstisna işleminizin çoğu, başarısızlıkların iyi rapor edilmesi için değil, başarıya ulaşmaktır. veri katmanında
  • , bir şey çok adımlı süreç ortasında yanlış giderse ne yapacağını göz önüne almalıyız. Sen gerçek hata yukarı süzülmesini beklerseniz, ancak bu tabaka bir hata sonra şeyleri toplama işlemek zorundadır. Bazen işlemleri kullanmak isteyeceksiniz.
  • Senkronize olmayan bir durumda (birden çok iş parçacığı nedeniyle (A) ya da (B.), çünkü iş mantığı "görev makineleri" üzerinde ayrı ayrı işlem görür ve daha sonra iş görür ve daha sonra harekete geçersiniz. günlüğe kaydetme hataları.
  • Doğrusu% 100'den uygulamanızın% 25'inde "hata işleme kodu" yazdığını görür. % 100, büyük olasılıkla, hata işlemeniz gibi görünmesini ve hissetmesini istediğiniz anlamına gelir. % 25, ​​gerçekten ele alınması gereken özel durumlar için zaman harcadığınız anlamına gelir.
+0

teşekkürler. SQLExceptions ile ilgili düşünceleriniz nelerdir? Sproc'ta ortaya çıkan hatalar için bunları DAL'de yakalar mısın ve özel bir hata mı atıyorsun yoksa bir alternatif mi? – Nick

+1

Şu andaki DAL'imde (daha fazla DA * aracı *, daha çok yarı-DAL nesneleri olan iş nesnelerime geçiyorum) otomatik olarak birkaç belirli hataları yakalarım ve ele alıyorum (deadlock kurbanı hatası # 1205 gibi). Bunu görüyorum, bir kez daha denedim.), Ancak hataların çoğunu perlatlayalım. Bazen İş nesnesi bu hata ile akıllı bir şey yapabilir; eğer olmasaydım, perçola izin verdim. DAL'imde yakında otomatik olarak hata ve sql komut metni ve parametrelerini otomatik olarak kaydedeceğim. Sql metnini hata mesajına faydalı bir şekilde ekledim, ancak bu bir güvenlik sorunu. –

+0

Sadece (** A **) kurtarma/tepki verme// veya başarılı olabilirseniz veya (** B **) üst üste gelen hata bilgisini iyileştirirseniz, yalnızca sprocs/udf'lerinizdeki yakalama hataları. Bu yüzden, sproc/udf 'lerde hata işlemesi hata değildir, ancak bazen onlara hata ekleyeceksiniz. –

1

: Eğer eşzamanlılık sorunları (kilitlenmeleri) neden olabilir hacminin her türlü varsa uygulamanız söz konusu SQL hatası tespit etmek ve işlemi yeniden deneyin isteyeceksiniz (örneğin işlem). Bu, veri veya iş katmanlarında bazı istisna işlemlerinin yapılmasını savunuyor.

-Krip

+0

alkış , – Nick

1

Ben onun en iyi uygulama son sorumlu anda istisnalar işlemek için inanıyoruz. Bu genellikle UI seviyesinde (diğer bir deyişle, bir MVC uygulamasında veya geleneksel bir asp.net uygulamasında codebehind'de) kontrol edilir. Bu yüksek seviyedeki kodunuz, kullanıcının ne sorduğunu "bilir" ve bir şey çalışmadığında yapılması gerekenler.

Taşıma istisnalar çağrı yığını aşağı alt genellikle düzgün istisnai durumlarla başa mümkün olmayan kod çağıran sonuçlanır. Veri katmanı olarak

, standart desenleri kullanmak istiyorsunuz (örneğin SqlConnection olarak IDisposables için using statement) kullanarak, bellek out veya diğer nadir durumlar için bunu yapmayın (oluşabilir biliyor belge istisnalar) ve daha sonra çağrı yığınlarını yaptıkları zaman akmasına izin verin. Çoğu durumda, bu istisnaları yakalamak ve tek istisna tipinde sarmak isteyebilirsiniz. Bu durumda, MANY istisnalarının arayanlar tarafından ele alınması gerekebilir. Eğer istisnalar gitmesine izin önce şeyler "temizlemek" gerekirse

, her zaman temizlemek için finally block kullanabilirsiniz. finally bloğunu kullanmak için catch'a gerek yoktur.

Özür, doğru istisna durumları vurgulamak için tasarlanan küçük web sitelerinin herhangi örneklerinden bilmiyorum.

+0

durumları için akılda tutulacaktır. Öyleyse, çöp toplama yöntemini kullanarak bağlantıyı kapatmak için çöp toplanmasını beklemek iyi olur mu? – Nick

+1

Hayır, bağlantıyı (a) bittiğinde hemen kapatmak veya Son olarak bloğunda (b) veya sözdizimini/desenini kullanmak istediğinizde otomatik olarak gerçekleşir. Ben bunu detaylandırırım. . . –

+0

@nick, 'using' ifadesi için cevabımdaki bağlantıyı kontrol eder. – Will