2010-04-20 14 views
8

Kodumuz, her yerde genel istisnayı yakalar.Genel İstisnanın kullanımını nasıl yeniden belirleyebilirim?

Genellikle bu hata, veritabanındaki bir günlük tablosuna yazar ve istenen işlemin başarısız olduğunu söylemek için kullanıcıya bir MessageBox gösterir. Veritabanı etkileşimi varsa, işlem geri alınır.

Bazı mantığı çözmek için bir iş mantığı katmanı ve bir veri erişim katmanı tanıttım. Veri erişim katmanında, hiçbir şey yakalamamayı seçtim ve aynı zamanda ArgümentNullExceptions ve ArgumentOutOfRangeExceptions'ı da atarım, böylece iletinin yığından iletilmesi veritabanından düz gelmez.

İş mantığı katmanında bir deneme yakalama koydu. Yakalamada işlemi geri alıyorum, kayıt ve geri alma işlemini yapın.

Sunum katmanında bir MessageBox görüntüleyen başka bir try catch var.

Şimdi kodun yalnızca bir veritabanına eriştiğini bildiğim bir Özel Durum yerine bir DataException ve bir ArgumentException yakalamayı düşünüyorum.

Kod bir web hizmetine eriştiğinde, bir HttpException, WebException veya SoapException oluşturulduğunda veri erişim katmanında oluşturulacak kendi "WebServiceException" ı oluşturabileceğimi düşündüm.

Şimdi, genellikle şu anda genel İstisnımı yakaladığım 2 veya 3 istisnayı yakalıyorum ve bence bu bana uygun görünüyor. İletiyi tanıtıcı katmana taşımak için herkes tekrar istisnalar sardı mı?

Sanırım Exception'ı yakalayan, oturum açmayı deneyen, "Uygulama bir hatayla karşılaştı" iletisini görüntüleyen ve uygulamadan çıktığı Main() 'e bir try catch'u eklemeliyim. Yani, sorum şu ki, planımda herhangi bir delik görüyor mu? Yakalamam gereken ya da bunları hemen hemen kapsayan bir istisna var mıdır (dosya erişimi dışında - bir yapılandırma dosyasına okuduğumuz sadece 1 yer olduğunu düşünüyorum).

cevap

2

Geri alma işleminiz için bir catch bloğunda yapmak yerine try/finally (veya eşdeğeri bir deyim olan) kullanın. Özellikle yalnızca belirli istisnaları yakalarsanız, beklenmedik bir İstisna türü atılırsa, veritabanı geri alma işleminin gerçekleştirilmesini isteyeceksiniz.Nadiren dışında herhangi bir yerde bir catch kullanmak Birkaç istisna dışında

: istisnalar sunucuda oturum böylece fiziksel bir katman sınırda

  • ben catch bloğunda atmak/log ile try/catch kullanın. WCF istisnaları gibi daha yeni teknolojiler, bir try/catch (örneğin WCF DispatchBehavior ile) olmadan kaydedilebilir.

  • Sunu düzeyindeki üst düzey işleyicide. iş ve veri kademelerinde

, denemede/nihayet (yani kullanarak ifadeleri) ama hemen hemen hiç bir yakalama bir sürü olacaktır.

+0

nihayet veya deyim kullanarak hakkında mükemmel bir noktaya bağlı değildir. İşlemin DAL'de olduğu yerde zaten bunu yapıyorum, ancak bazı işlemlerim hala BLL'de olduğundan, bir MyDatabase.Dispose() yöntemini ortaya çıkarmam veya "using" deyimi için – Colin

+0

ifadem için SqlCeTransaction'ı kaydırmam gerekecek Fiziksel bir sınırla ne demek istediğinden emin değilsin. BLL'den DAL'e her yöntemde bir sınır yok mu? Bu durumda, BLL'deki her çağrı, try/catch log/throw modeline sahip olmalıdır. Ancak uygulama ve veritabanı, uygulama ve web hizmeti veya uygulama ve dosya sistemi arasındaki fiziksel sınır anlamına gelirse, günlüğümü BLAN'a değil DAL'ye taşırdım. Ama DAL veya BLL'de neredeyse hiç yakalanmadığınızı söylüyorsunuz ve elbette avcıların tüm güncellemelerin eklendiği ve silmelerinin yapıldığı "MyDatabase" sınıfında oturacaklarını söyledim. Bu daha iyi geliyor. – Colin

2

Uygulamanızda bazı iyileştirmeler yapıyor gibi görünüyor. Ayrıca genellikle bir uygulamanın en dış katmanını try/catch Exception bloğuna sardım, böylece beklenmedik istisnalar (örneğin çalışma zamanı olanlar) uygulamanın zarafetle çıkmasına izin verebilir. o iş mantığı bir veri geri alma sorumluluğu için temsilci mantıklı eğer sizin için

Bir soru. Bu veri erişim katmanında daha iyi kapsüllenmiş görünecektir. Ardından, veri katmanından herhangi bir eski istisna atmak yerine veri katmanından bir istisna atarsınız, çünkü veri katmanınız beklemediğiniz bir şeyi atarsa ​​iş mantığı katmanınıza ne olur? Ya da daha sonra veri erişim katmanınızı ayıklayıp daha sonra başka bir şeyle değiştirirseniz ne olur? Ya da başka bir şeyle değiştirirseniz ne olur? En azından, tüm geri dönüş mantığınızı iş mantığı katmanından kaldırmanız gerekir.

+0

Teşekkür ederim Chris. Bu ikilemi düşündüm. İş mantığında, muhtemelen tamamen veri erişim katmanında olması gereken veri erişim çağrılarını birleştiren yöntemler vardır. Öte yandan, iş mantığının benim için mantıklı olan veri çağrılarını birleştiren bazı yöntemler var. DAL ve MyDatabase.RollbackTransaction() üzerinde MyDatabase.BeginTransaction() aradığımda gezinmek için. Eminim "İş" işlemlerini ele almak için daha iyi yollar vardır, ama en azından BLL bir SqlCeTransaction ..... – Colin

İlgili konular