Java'da istisnalar için istisna soneki


19

İstisna sınıflarında bir İstisna soneki belirtmek bana bir kod kokusu gibi geliyor (Gereksiz bilgi - adın geri kalanı bir hata durumunu ima eder ve İstisnadan devralır). Ancak, herkesin yaptığı gibi görünüyor ve iyi bir uygulama gibi görünüyor.

Bunun neden iyi bir uygulama olduğunu anlamaya çalışıyorum.

Zaten istisnalar genellikle sınıf adında sonek istisnası var sorusunu gördüm ve okudum

Soru PHP için ve yanıtlar büyük olasılıkla Java için geçerliyken. Başka argümanlar var mı veya gerçekten açıkça ayırt etmek kadar basit mi?

Önceki sorudan örnekler alırsak - gerçekten FileNoFoundbir istisna olmayan adla java sınıfları olabilir mi? Olabilirse, son eklenmesi gerekir Exceptionmi?

ExceptionBüyük bir çoğunluğunun tutulmasında hızlı bir hiyerarşiye bakıldığında , bunların büyük çoğunluğunun istisna eki vardır, ancak birkaç istisna vardır.javassistörneğin - eki olmadan birkaç istisna var gibi görünüyor bir kütüphanenin bir örnektir BadByteCode, BadHttpRequestvb

BouncyCastle istisnalar dışında başka bir lib CompileError

Bu konuda biraz bilgi ile biraz da googled.


2
"Tüm istisnalar bir Exceptionsonek taşımalı mı yoksa istisnai istisnalar için istisnalar mı yapmalıyız?" ;)
tdammers

2
Aslında Hata İstisna gibidir (OutOfMemoryError bakınız) ancak (neredeyse onlarla başa asla senin böylece) kurtarmak için zor olan şeyler içindir
mandal ucube

1
Ayrıca, genel bir kural olarak 'sınıfların isimler ve yöntemlerin fiiller (eylemler) olması' gerektiğini duydum. FileNotFound ArrayIndexOutOfBoundsve OutOfMemorydaha fazla gözlem / açıklamadır, fakat daha sonra isme uygulanır Exception.
MikeTheLiar

Yanıtlar:


27

Landei'nin cevabı iyi bir cevap, ama aynı zamanda gramer yanıtı da var. Sınıf isimleri isim olmalıdır . "OutOfMemory" nedir? "FileNotFound" nedir? "İstisna" yı isim olarak düşünüyorsanız, tanımlayıcı bunu belirten sıfattır. Sadece herhangi biri değil Exception, bir FileNotFoundException. Bir yakalamanıza gerek yokOutOfMemoryBir "mavi" satın almak için mağazaya gittiğinizden daha fazlasını .

Bu, kodunuzu bir cümle olarak okuduysanız da gösterilir: " Trydoing ..., catch OutOfMemory Exceptions"


1
"Bir sınıf normalde gerçek dünyada bir şeyi temsil ettiği için isimleri kullanmaya çalış" makalesini alıntılamak. Ancak bu davaya istisnalar düşüyor mu? Benim için, daha çok bir hata mesajını temsil eden bir programlama eseri gibidirler. " OutOfMemoryİstisna alacaksınız " ifadesi "İstisna alacaksınız " ifadesinden daha iyi OutOfMemoryException, değil mi?
greg0ire

1
@ greg0ire - "Sen alacaksın" olarak denemelisin OutOfMemoryException. Bununla birlikte, PIN numaralarımız ve ATM makinelerimiz de var, bu yüzden OOME istisnası o kadar sıra dışı olmaz.
Bobson

Burada yaptığınız nokta gerçekten en iyi olduğunu düşünüyorum (isim çatışmaları ile ilgili bir isim alanları sayesinde, en azından php sayesinde artık tutmuyor). Tüm bunlar hakkında söyleyecek daha çok şeyim var ve yakında bir cevap göndereceğim.
greg0ire

Bitti! Ne düşünüyorsun?
greg0ire

@Bobson İsimlerin Krallığı'nı okumanızı tavsiye ederim . Bir isim olmak için her şeye ihtiyacımız yok. Neden "Bir alacak OutOfMemoryExceptionbasitçe" sen olmak varken " olan bellek yetersiz"? Biz kullanmayan Classekleri ( DogClass, CatClass, XmlReaderClass, ...).
Matthieu Napoli

6

Ben istisnalar (ve hatalar ve teorik olarak diğer düşünüyorum ThrowableGenellikle çok net ve sınırlı amaç, onlar (özel dil yapıları ile kullanılır: s) (ki genellikle son eki olarak kullanılmaz) arayüzler veya çeteleler gibi şeyler farklıdır try, catch,throw , throws) ve özel kurallara uyun (örneğin kontrolsüz istisnalar vs hiçbir generic'leri işaretli). Bir bakıma bunlar sadece istisna olarak kullanılan sınıflar değil, sınıflar aracılığıyla uygulanan bir istisna mekanizmasıdır.

Yani bir istisna ile uğraşıyorsanız ve bunu böyle tanımıyorsanız, genellikle bir şey çok yanlıştır (bu da numaralandırmalar veya arayüzler gibi şeyler için geçerli değildir). Bu yüzden "normal" sınıflar arasındaki bu farkların görsel bir ipucu gerektirecek kadar büyük olduğunu düşünüyorum.


1
Bana aykırı geliyor. İstisnalar bu kadar özel ve özel şekillerde kullanılıyorsa ve açıkça tanınabilirse, neden görsel bir ipucuna ihtiyacınız var?
Michael Borgwardt

@MichaelBorgwardt - Bence özel ve özel şekillerde kullanıldıkları için açıkça tanınabilir olmaları için görsel ipuçlarına sahip olmaları gerektiğini söylüyor. Varlık ben bile bilmiyorum dedim olabilir miras olmayan bir şeyi atmak ExceptionJava - Yok C # can. Eğer yapamıyorsanız, "bir istisna ile uğraşacağınız ve [böyle] tanımayacağınız" bir senaryo düşünemiyorum.
Bobson

ThrowableJava ile olmayanları da atamazsınız . Bununla birlikte, istisnalarla yalnızca try- catchayarlarında değil, örneğin karmaşık nesneler için bir tür doğrulama yaptığınızda ( yalnızca ilki ile ilgili tüm sorunları bilmek istediğinizde) istisnalar toplayabilirsiniz . Bu gibi durumlarda, örneğin listenizdeki şeyleri yeniden atabileceğinizi bilmelisiniz, bu yüzden onları aramak ValidationIssueyerine kötü olur ValidationException.
Landei

0

Ancak, herkesin yaptığı gibi görünüyor ve iyi bir uygulama gibi görünüyor.

Evet, gerçekten herkes yapıyor, bu yüzden bu bir uygulama, ama yine de iyi mi? Birkaç kişi bunu sorguluyor:

  • http://mnapoli.fr/approaching-coding-style-rationally/ (İstisna soneki § bağlam: php)
  • bağlantılı video, https://vimeo.com/album/2661665/video/74316116 (53: 00'a atla, context: php), makaleye ilham verir ve her istisna kullandığınızda bir anahtar kelimeniz olduğunu gösterir zaten bunun bir istisna olduğunu gösteriyor
  • http://verraes.net/2013/10/verbs-in-class-names/ @Bobson'un cevabındaki ifadenin nasıl mutlak olmayabileceğini gösterir ve bazen uygulama için son ekin iyi olduğunu veya altyapı düzeyi istisnalar, ve bazen daha hassas ve anlamlı bir şey ifade etmek için bu uzun sonek tarafından alınan karakterleri kaydetmeye çalışmalısınız. Bu nokta, yalnızca kültürün iş kuralları ihlalleri için istisnalar kullanacağı bir dil kullanıyorsanız mantıklıdır.
  • SO bağlantı ad çakışmalarıyla ilgili puan veriyor, ancak şimdi ad alanlarımız var, değil mi?

Bu bir java sorusu, php değil . Deyimler diller arasında farklıdır. Bununla birlikte, üçüncü bağlantınızdaki bu alıntıya kesinlikle katılmıyorum: "İstisnalar olaylara benzer olabilir, ... istenmeyen bir olay olduğu nüansıyla, bazı işlemlerin örneğin iş kurallarıyla tutarsız olduğuna dair bir uyarı geçerlidir. " Belki PHP bu konuda farklı, ama bence istisnalar istisnai olmalı. Bir iş kuralı herhangi bir şekilde ihlal edilirse, normal mantığınız bu kuralın üstesinden gelmelidir - bu normal davranış için bir istisna değildir .
Bobson

Her dil için ayrı ayrı değiştiği konusunda haklı olabilirsiniz: python hakkında şu konuya bakın: gossamer-threads.com/lists/python/python/796627 . php ve python açıkça performans odaklı değil, bu yüzden java ile bu fark var (performans odaklı, değil mi?). İş kuralı ihlalini doğru bir şekilde ele almak için doğru düzeyde olmadan önce çağrı yığınınızı geçecek birkaç katmanınız varsa, istisnalar en iyi IMO'dur. Ayrıca dönüş türlerini daha tutarlı hale getirir (yanlış veya doğru değil her zaman aynı türü döndürürsünüz). Cevabımı bu hesaba düzenleyeceğim
greg0ire
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.