Bir istisna engelleme hatasıdır .
Her şeyden önce, en iyi uygulama , bir engelleme hatası olmadığı sürece, herhangi bir hata için istisna atmayın .
Hata engelleniyorsa , istisnayı atın. İstisna çoktan atıldıktan sonra, gizlenmesine gerek yoktur, çünkü olağanüstüdür; kullanıcıya bunu bildirin (kullanıcı arayüzünde kullanıcı için yararlı bir şey için tüm istisnayı yeniden biçimlendirmeniz gerekir).
Yazılım geliştiricisi olarak işiniz, bir parametre veya çalışma zamanı durumunun bir istisnada sona erebileceği istisnai bir durumu önlemeye çalışmaktır . Yani, istisnalar yoksayılmamalı, ancak bunlardan kaçınılmalıdır .
Örneğin, bazı tamsayı girdilerinin geçersiz bir biçimde gelebileceğini biliyorsanız , int.TryParse
yerine kullanın int.Parse
. "Başarısız olursa, sadece bir istisna atın" demek yerine bunu yapabileceğiniz birçok durum vardır.
İstisnaları atmak pahalıdır.
Ne de olsa, bir istisna atılırsa, istisnayı atıldıktan sonra günlüğe yazmak yerine, en iyi uygulamalardan biri ilk şans istisnası işleyicisinde onu yakalamaktır . Örneğin:
- ASP.NET: Global.asax Uygulama_ Hatası
- Diğerleri: AppDomain.FirstChanceException olayı .
Benim duruşum, yerel denemelerin / yakalamaların, bir istisnayı başka bir duruma çevirebileceğiniz veya çok, çok, çok, çok, çok özel bir durum ("kütüphane hatası") için "sessizleştirmek" istediğiniz özel durumları ele almak için daha uygun olduğudur. tüm hatayı gidermek için susturmanız gereken alakasız bir istisna atma).
Geri kalan davalar için:
- İstisnalardan kaçınmaya çalışın.
- Bu mümkün değilse: birinci şans istisna işleyicileri.
- Veya bir Keskinleştirme Sonrası yönü (AOP) kullanın.
Bazı yorumlarda @thewhiteambit yanıtlanıyor ...
@thewhiteambit dedi:
İstisnalar Önemli Hatalar değildir, İstisnalardır! Bazen onlar bile Hata değildir, ancak onları dikkate almak, Ölümcül Hatalar, İstisnaların ne olduğunu tamamen yanlış anlamaktır.
Her şeyden önce, bir istisna nasıl bir hata olamaz?
- Veritabanı bağlantısı yok => istisna.
- Bazı type => özel durumlarına ayrıştırmak için geçersiz dize biçimi
- JSON ayrıştırılmaya çalışılıyor ve girdi aslında JSON => özel durumu değil
null
Nesne bekleniyorken argüman => istisna
- Bazı kitaplıklarda hata var => beklenmeyen bir istisna atar
- Bir soket bağlantısı var ve bağlantısı kesiliyor. Sonra bir mesaj göndermeye çalışıyorsunuz => istisna
- ...
Bir istisna atıldığında 1k durumlarını listeleyebiliriz ve sonuçta olası durumlardan herhangi biri bir hata olacaktır .
Bir istisna olduğu günün sonunda o tanısal bilgi toplar bir nesne olduğu için, bir hata - bir mesajı var ve bir şeyler yanlış gittiğinde o olur.
İstisnai bir durum olmadığında hiç kimse bir istisna fırlatamaz. İstisnalar hataları engellemelidir, çünkü atıldıktan sonra, kullanmaya çalışın / yakalayın ve kontrol akışını uygulamak için istisnalar , uygulama / hizmetinizin istisnai bir duruma giren işlemi durduracağı anlamına gelir .
Ayrıca, herkese Martin Fowler tarafından yayınlanan (ve Jim Shore tarafından yazılan) hızlı paradigmayı kontrol etmesini öneriyorum . Bu belgeye bir süre önce gelmeden önce bile istisnaları nasıl ele aldığımı hep anladım.
[...] onları düşünün Ölümcül Hatalar istisnaların tamamen yanlış bir anlayıştır.
Genellikle istisnalar bazı işlem akışlarını azaltır ve bunları insan tarafından anlaşılabilir hatalara dönüştürmek için kullanılır. Bu nedenle, bir istisna aslında hata vakalarını ele almak ve bir uygulama / hizmet tam çökmesini önlemek ve kullanıcı / tüketiciye bir şeyler ters gittiğini bildirmek için üzerinde çalışmak için daha iyi bir paradigma gibi görünüyor.
@Thewhiteambit ile ilgili daha fazla cevap
Örneğin, Veritabanı Bağlantısının eksik olması durumunda, program istisnai olarak yerel bir dosyaya yazmaya devam edebilir ve değişiklikleri yeniden kullanılabilir duruma geldiğinde Veritabanına gönderebilir. Geçersiz Dize-Sayı dökümünüz, Ayrıştırma ("1,5") için varsayılan İngilizce dilinin başarısız olması ve tamamen Almanca yorumuyla denemeniz gibi, İstisnada dil-yerel yorumuyla yeniden ayrıştırmaya çalışılabilir. çünkü ayırıcı olarak nokta yerine virgül kullanıyoruz. Bu İstisnaların engellememesi gerektiğini görüyorsunuz, sadece İstisna işlemeye ihtiyaçları var.
Uygulamanız veritabanına veri göndermeden çevrimdışı çalışabiliyorsa , kontrol akışını kullanmak bir anti-desen olarak kabul edildiğinden istisnalar kullanmamalısınız try/catch
. Çevrimdışı çalışma olası bir kullanım durumudur, bu nedenle veritabanına erişilebilir olup olmadığını kontrol etmek için kontrol akışı uygularsınız, erişilemez olana kadar beklemezsiniz .
Ayrıştırma şey de beklenen bir durum (olan OLAĞANÜSTÜ değil DURUM ). Bunu bekliyorsanız, kontrol akışını gerçekleştirmek için istisnalar kullanmazsınız! . Kullanıcıdan kültürünün ne olduğunu bilmek için bazı meta veriler alırsınız ve bunun için biçimlendiriciler kullanırsınız! .NET, bu ve diğer ortamları da destekler ve uygulamanızın / hizmetinizin kültüre özgü kullanımını bekliyorsanız, sayı biçimlendirmesinden kaçınılması gerektiğinden bir istisna oluşturur .
İşlenmeyen bir Kural Dışı Durum genellikle Hata olur, ancak Kural Dışı Durumların kendisi codeproject.com/Articles/15921/Not-All-Exceptions-Are-Errors değildir
Bu makale sadece yazarın görüşü ya da görüşüdür.
Vikipedi de sadece artikül yazar (lar) ının görüşü olabileceğinden, bunun dogma olduğunu söyleyemem , ancak istisna makaleye göre Kodlama'nın bazı paragraflarda bir yerde ne dediğini kontrol ederim :
[...] Programa devam etmek için ortaya çıkan belirli hataları işlemek için bu istisnaları kullanmaya istisna ile kodlama denir. Bu anti-desen yazılımı performans ve sürdürülebilirlik açısından hızla bozabilir.
Ayrıca bir yerde şöyle diyor:
Yanlış istisna kullanımı
Genellikle istisna ile kodlama, yanlış istisna kullanımıyla yazılımda başka sorunlara yol açabilir. Benzersiz bir sorun için kural dışı durum işleme kullanımına ek olarak, kural dışı durum kullanımı, kural dışı durum yükseltildikten sonra bile kod yürüterek bunu daha da ileri götürür. Bu zayıf programlama yöntemi, birçok yazılım dilinde goto yöntemine benzer, ancak yalnızca yazılımda bir sorun algılandıktan sonra gerçekleşir.
Dürüst olmak gerekirse, yazılımın geliştirilemeyeceğine inanıyorum. Bunu biliyorsan ...
- Veritabanınız çevrimdışı olabilir ...
- Bazı dosyalar kilitlenebilir ...
- Bazı biçimlendirme desteklenmiyor olabilir ...
- Bazı alan adı doğrulaması başarısız olabilir ...
- Uygulamanız çevrimdışı modda çalışmalıdır ...
- ne olursa olsun ...
... bunun için istisnalar kullanmayacaksınız . Sen olur destekleyen düzenli kontrol akışını kullanarak bu kullanım durumları.
Ve bazı beklenmedik kullanım durumları kapsanmazsa, kodunuz hızlı bir şekilde başarısız olur, çünkü bir istisna atar . Doğru, çünkü bir istisna istisnai bir durumdur .
Öte yandan ve son olarak, bazen beklenen istisnaları atan istisnai durumları kapsarsınız , ancak bunları kontrol akışını uygulamak için atmazsınız. Bunu, üst katmanları bazı kullanım durumlarını desteklemediğinizi bildirmek istediğiniz için veya kodunuz belirli argümanlarla veya ortam verileri / özellikleriyle çalışmazsa bildirirsiniz.