Bir dil istisnaları doğal olarak destekliyorsa, istisnalar atılması tercih edilir ve istemciler bir başarısızlıkla sonuçlanmasını istemiyorlarsa istisnayı yakalayabilirler. Aslında, kodunuzun müşterileri istisnalar bekler ve dönüş değerlerini kontrol etmeyeceklerinden birçok hatayla karşılaşırlar.
Bir seçeneğiniz varsa, istisnaları kullanmanın bir kaç avantajı vardır.
Mesajlar
İstisnalar, geliştiricilerin hata ayıklama amacıyla kullanabileceği veya istenirse kullanıcılara bile gösterebileceği, kullanıcı tarafından okunabilen hata mesajları içerir. Tüketici kod istisnayı idare edemiyorsa, bunu her zaman kaydedebilir, böylece geliştiriciler, geri dönüş değerinin ne olduğunu bulmak için diğer izlerde durmak zorunda kalmadan günlükleri gözden geçirebilir ve geri dönüşün ne olduğunu bulmak için bir tabloda eşleyebilirler. gerçek istisna.
Dönüş değerleri ile kolayca sağlanabilecek ek bilgi yoktur. Bazı diller son hata mesajını almak için yöntem çağrısı yapmayı destekleyecektir, bu nedenle bu endişe biraz ortadan kalkar, ancak arayan kişi fazladan arama yapmayı gerektirir ve bazen bu bilgiyi taşıyan 'özel bir nesneye' erişim gerektirir.
İstisna mesajları durumunda, mümkün olduğunca fazla içerik sağlıyorum:
Kullanıcı profilinde referans verilen "bar" adlı kullanıcı için "foo" adında bir politika alınamadı.
Bunu bir dönüş kodu -85 ile karşılaştırın. Hangisini tercih edersiniz?
Çağrı yığınları
İstisnalar genellikle ayrıca, hata ayıklama kodunun daha hızlı ve daha hızlı hata ayıklamasına yardımcı olan ayrıntılı arama yığınlarına sahiptir ve istenirse arama kodu tarafından da kaydedilebilir. Bu, geliştiricilerin sorunu genellikle tam çizgiye göre belirlemelerini sağlar ve bu nedenle çok güçlüdür. Bir kez daha, bunu geri dönüş değerleri olan bir günlük dosyasıyla (-85, 101, 0 vb. Gibi) karşılaştırın, hangisini tercih edersiniz?
Hızlı önyargılı yaklaşım başarısız
Bir yöntem başarısız olan bir yere çağrılırsa, bir istisna atar. Çağıran kodun istisnayı açıkça bastırması gerekir, aksi halde başarısız olur. Bunu gerçekten şaşırtıcı buldum çünkü geliştirme ve test sırasında (ve hatta üretim sırasında) kod hızlı bir şekilde başarısız oluyor ve geliştiricilerin bunu düzeltmesi için zorluyor. Dönüş değerleri söz konusu olduğunda, bir dönüş değeri kontrolü kontrolünün kaçırılması durumunda, hata sessizce göz ardı edilir ve hata beklenmeyen bir yere çıkar ve genellikle hata ayıklama ve düzeltme maliyeti çok daha yüksek olur.
Sarma ve Açma İstisnaları
İstisnalar diğer istisnaların içine sarılabilir ve ardından gerekirse açılabilir. Örneğin, kodunuz ArgumentNullException
, arama kodunda hangi UnableToRetrievePolicyException
işlemin başarısız olacağını , çünkü arama kodunda başarısız olan kodu atabilir . Kullanıcıya yukarıda verdiğim örneğe benzer bir mesaj gösterilse de, bazı tanı kodları istisnayı çözebilir ve bir ArgumentNullException
soruna neden olduğunu bulabilir; bu, tüketicinin kodunda kodlama hatası olduğu anlamına gelir. Bu, geliştiricinin kodu düzeltebilmesi için bir uyarı verebilir. Bu gibi gelişmiş senaryoların geri dönüş değerleri ile uygulanması kolay değildir.
Kodun basitliği
Bunu açıklamak biraz zor, ama bu kodlama yoluyla hem istisnalar hem de dönüş değerleri ile birlikte öğrendim. Dönüş değerleri kullanılarak yazılan kod genellikle bir çağrı yapar ve ardından dönüş değerinin ne olduğu konusunda bir dizi kontrol yapar. Bazı durumlarda, başka bir metoda çağrı yapar ve şimdi bu metodun geri dönüş değerleri için başka bir dizi kontrol yapar. İstisnalarda, istisnasızlık çoğu durumda olmasa da çoğu zaman daha kolaydır. Bir try / catch / finally bloklarına sahipsiniz, çalışma zamanı, nihayet temizlik için kodu engellemek için elinden gelenin en iyisini yapmaya çalışıyor. İç içe geçmiş try / catch / nihayet blokları takip etmek ve sürdürmek, iç içe geçmiş if / else ve ilişkili dönüş değerlerini çoklu yöntemlerden nispeten kolaydır.
Sonuç
Kullandığınız platform istisnaları destekliyorsa (özellikle Java veya .NET gibi), o zaman kesinlikle istisnalar atmanın dışında başka bir yol olmadığını varsaymalısınız, çünkü bu platformlarda istisnalar atmak için kurallar vardır ve müşterileriniz bekleyecektir. yani. Kütüphanenizi kullanıyor olsaydım, geri dönüş değerlerini kontrol etmeye zahmet etmeyeceğim çünkü istisnaların atılmasını bekliyorum, bu platformlardaki dünya böyle.
Bununla birlikte, eğer C ++ ise, dönüş kodlarıyla zaten büyük bir kod temeli bulunduğundan ve çok sayıda geliştiricinin istisnaların aksine değerleri döndürmek için ayarlandığı için (örneğin, Windows HRESULT'larla doludur) belirlenmesi daha zor olacaktır. . Ayrıca, birçok uygulamada, bu da bir performans sorunu olabilir (veya en azından öyle algılanan).
try
/catch
var. Ek olarak, yığınınızı ele almak için daha uygun bir yere koyabilirsiniztry
/catch
endişelerin daha fazla ayrılmasını sağlar).