İstisnalar atama istisnalarına karşı mı?


38

Genellikle bir işlev yazarken, bu tür hataları olabildiğince erken tespit etmek için girdilerin geçerli olduğundan emin olmak istiyorum (bunlara ön koşul denir). Bir önkoşul başarısız olduğunda, her zaman bir istisna fırlattım. Ancak bunun en iyi uygulama olup olmadığından ve iddiaların daha uygun olacağından şüphe duymaya başladım.

Öyleyse ne zaman yapmalıyım: bir iddia kullanmak ne zaman ve ne zaman bir istisna atmak uygun olur?


3
Bence bu soru stackoverflow'ta sorulmalı, muhtemelen orada bir düzine defa sorulmuş olmasına rağmen, zaten orada birçok cevap bulabilirsin.
user281377

Yanıtlar:


50

İddialar sadece yanlış olması mantıklı olarak imkansız olması gereken koşulları doğrulamak için kullanılmalıdır (okuma: sağlık kontrolleri). Bu koşullar yalnızca kendi kodunuz tarafından oluşturulan girişlere dayanmalıdır. Harici girişlere dayanan kontroller istisnalar kullanmalıdır.

Takip etme eğiliminde olduğum basit bir kural, özel fonksiyonların iddialarla ilgili argümanlarını doğrulamak ve kamu / korunan fonksiyonların istisnalarını kullanmaktır.


Harici girişler için istisnalar kullanma konusunda iyi nokta. Oluşturulmaya çalışılırken dosya / veritabanı vb / problemlerin yazma - Aynı zamanda bu da hiç çıkışlar eklersiniz
ChrisF

13
Ve kaçınılmaz olarak, bu iddiaların üretimde tetiklendiğini göreceksiniz. Özel şeyleri onaylamak için + 1'leyin! Belki de "girdileri tam olarak kontrol altındayken iddiaları kullan" diyebilirsiniz.
Frank Shearar

1
Java'da, en azından, -ea komut satırı parametresi ile onay kontrolünü etkinleştirmeniz gerekir. Bu, açıkça açıkça açmadığınız sürece iddiaların etkili bir şekilde kullanılmayacağı anlamına gelir.
Bill Michell

29

Programlama hatalarını bulmak için iddialar kullanılır. Tüm iddiaların kaldırıldığı zaman programlarınız da iyi çalışmalıdır.

İstisnalar, diğer yandan, program mükemmel olduğunda bile olabilecek durumlar içindir; donanım, ağ, kullanıcılar gibi dış etkenlerden kaynaklanırlar.


Bu koymak için oldukça iyi bir yol. Kullanıcı yanlış bir şey girerse, bir istisna atayın. Giriş doğruysa ancak bir şey hala yanlışsa, bir onaylama işlemi yapın.
Mateen Ulhaq

3

Tipik bir programlama uygulaması, üretim / sürüm oluşturmalardan gelen iddiaları derlemektir. İddialar yalnızca iç test sırasında varsayımların başarısızlığını yakalamak için yardımcı olacaktır. Dış kurumların davranışını üstlenmemelisiniz, bu nedenle ağdan veya kullanıcıdan gelen olayları iddia etmemelisiniz. Ayrıca, bir iddianın başarısız olması durumunda üretim yapılarına ilişkin kullanım kodunu yazmak iyi bir uygulamadır.

Örneğin, C

int printf(const char *fmt, ...)
{
  assert(fmt);  // may fail in debug build but not in production build
  if (!fmt) return -1; // handle gracefully in production build
  ...
}

İstisnaların üretim yapılarına inşa edilmesi amaçlanmıştır. İstisnaya alternatif, iddiaları değil hata döndürmektir.


2
Aynı koşul için zarif bir davranış sergilemenin ardında zarif bir davranış sergilemenin iyi bir fikir olduğunu sanmıyorum. Kaçınılmaz olarak, zarif davranış yalnızca üretim sürümünde bulunduğundan, zarif davranışla başa çıkması gereken kod, kötü bir şekilde test edilmeyecek ve kodun daha kötü olmasa bile, kodun korunmadığı kadar kötü çökecektir.
Sebastian Redl

0

Benim için iddiaların bir sorunu, Java’da varsayılan olarak devre dışı bırakılmış olmalarıdır.

Yıllarca katılımsız çalışan programın, hatalı verilerde (beklenmedik bir şekilde) veri bozulmasını önlemek için olabildiğince erken çökmesi gereken ilk başarısız stratejisini kullanıyoruz. Bunu kontrol için kullandığımız şeydir ve varsayımları kullanarak temelde aktif olmadıklarını riske atarız.

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.