2010-04-13 21 views
7

Bazı veri erişim kodu yazıyorum ve veritabanında potansiyel olarak "geçersiz" veri durumlarını kontrol etmek istiyorum. Örneğin, veri tabanından bir widget döndürüyorum ve sadece bir tane bekliyorum. İki tane alırsam bir istisna atmak istiyorum. Başvurusal bütünlük bunun oluşmasını engellese de, şemayı hiç değiştirmeden DBA'lara bağlı kalmak istemiyorum (bunu açıklığa kavuşturmak için, eğer birincil anahtar kısıtlaması kaldırılırsa ve bir dupe olursa, hızlı ve açık bir şekilde kırmak istiyorum).Geçersiz veritabanı durumu için hangi .NET istisnası atılacak?

System.IO.InvalidDataException kullanmak istiyorum, ancak bir dosya akışı ile uğraşmadığı için yanıltıcı olabilir. Genel bir uygulamaexception ile gittim. Daha iyi bir fikri olan var mı?

herhangi uygun standart istisna bulamayan Özel bir istisna yazabilirsiniz

cevap

15

InvalidDataException oldukça makul görünüyor bana:

  • adı bunu
  • açıklamasında
  • Hiçbir şey dosyalarını bahseder veritabanından veri "akışı" etkin bir olduğunu göz önüne aldığımızda açıklama çok makul uyuyor, bu yüzden şeyler o taraftaki endişe olmaz mükemmel
  • uyuyor

Verileri bir mağazadan etkin bir şekilde serileştiriyorsunuz. Bir RDBMS olur, ancak bu nispeten önemsizdir. Veriler geçersiz, bu nedenle InvalidDataException iyi uyuyor.

Başka şekilde ifade etmek gerekirse - bir dosyadan veri yüklüyse InvalidDataException kullanıyor musunuz? Varsayalım ki, atılan istisna olarak, verilerin nereden geldiğini niçin fark etmeliyiz?

+0

Evet, verileri bir dosyadan yüklemek için kullanırdım - Mantığınıza katılıyorum. Devam edeceğim ve InvalidDataException kullanacağım. – jslatts

+2

Bu muhtemelen muhtemelen en uygun kural dışı durum sınıfıdır. Sadece System.Data' ile ilgili şeyler yaptığınızda 'System.IO' ad alanından bir istisna atmak için - @Jon Skeet'in veri akışı argümanına rağmen garip IMHO hissediyor. (Tabi ki, ad alanlarının somut anlamı fazla tahmin edilmemeli, ama yine de, atılacak doğru bir şey olmadığına dair ince bir mesaj iletiyor.) Bu durumda, özel bir istisna sınıfının sağlanacağını düşünüyorum. haklı olmak – stakx

+0

Şahsen destek istemlerinin doğru bir şekilde yönlendirilmemesinin nedeni için çerçeve dışı koddan yerel çerçeve istisnaları atayım. Belki de ApplicationInvalidDataException adında bir alt sınıf uygun olur mu? –

0

...

Ama, de ki: bilgi tutarlılığı meydana gelmesini önlemek gerekir

olsa bile, ben , hiçbir zaman şemayı değiştirmeyerek DBA'lara bağımlı olmak istemez . Birisi DB şema değiştirdiğinde

, değişiklikler bir istisna gerekiyorsa o olur

+2

Err, yanlış söyledim. Sadece hatanın hızlı bir şekilde yüzeye çıkmasını istiyorum, şema benim altımdan değiştirildi. Özel bir özel durum oluşturabileceğimi biliyorum, ancak iyi bir varsayılan değeri kaçırmadığından emin olmak istedim. – jslatts

6

... siz de uygulama/veri-giriş kodu için bazı değişiklikler yapmanız gerekecek oldukça büyük Neyle uğraştığınızı tam olarak anlatın, neden kendi istisnayı yaratmıyorsunuz?

Sadece System.Exception adresinden devralın. Sadece devam edin ve kendi yaratmak,

InvalidConstraintException
NotSupportedException
OverflowException

Veya:

+0

Sadece Brad Abram'ın tavsiyelerini takip etmeye çalışıyordum ve istisnai olarak uygun bir yapıyı kaçırmadığından emin olmak istedim: http://blogs.msdn.com/brada/archive/2005/03/27/402801.aspx – jslatts

+0

+1 Kendi İstisnenizi Oluşturmak benim tavsiyem de olurdu - hatalarını izlerken arkadaşınız. Daha da fazlası, uygulamanıza veya iş mantığınıza bağlı sınırlar ve kısıtlamalar söz konusu olduğunda. – Filburt

1

Ben aşağıdakilerden birini kullanın için cazip olabilir TooManyRowsException

+1

Bu, kısıtlamanın kendisinin geçersiz olduğu anlamına geliyor - ViolatedConstraintException veya ConstraintViolationException? –

+0

@Jon: Bir şekilde ihlal edilmiş bir kısıtlamadır. Onun durumunda kısıtlama var, o sadece onu bırakan veritabanı adamından korkuyor. – NotMe

İlgili konular