Basit tutuyorum.
Bir kütüphanenin temel istisna türü std ::: runtime_error (C ++ 'dan diğer dillere uygun olarak uygulanır) ile genişletilir. Bu istisna bir mesaj dizesi alır, böylece giriş yapabiliriz; her atış noktasının benzersiz bir mesajı vardır (genellikle benzersiz bir ID ile).
Bu kadar.
Not 1 : İstisnayı yakalayan birinin istisnaları düzeltebileceği ve eylemi yeniden başlatabileceği durumlarda. Uzak bir konumda potansiyel olarak düzeltilebilecek şeyler için türetilmiş istisnalar ekleyeceğim. Ancak bu çok nadirdir (Yakalayıcının atış noktasına yakın olması muhtemel değildir, bu nedenle problemi düzeltmek zor olacaktır (ancak her şey duruma bağlıdır)).
Not 2 : Bazen kütüphane o kadar basittir ki kendi istisnasını vermeye değmez ve std :: runtime_error yapar. Bir istisnaya sahip olmak, onu std :: runtime_error'dan ayırt etme yeteneği kullanıcıya onunla bir şeyler yapmak için yeterli bilgi verebilirse önemlidir.
Not 3 : Bir sınıfta genellikle hata kodlarını tercih ederim (ancak bunlar asla sınıfımın genel API'sından kaçmayacaktır).
Ticari işlemlerinize bakarken:
Gördüğüm ödünleşmeler şunları içerir:
Daha fazla istisna sınıfı, API kullanıcıları için (kullanıcı yapılandırmasına veya veri hatalarına eğilimli veya bulunmayan dosyalar) çok ince hata düzeylerine izin verebilir
Daha fazla istisna gerçekten daha iyi tahıl kontrolü sağlıyor mu? Soru, alıcı kodun istisnayı temel alarak hatayı gerçekten düzeltebileceği hale gelir. Eminim böyle durumlar vardır ve bu durumlarda başka bir istisnanız olmalıdır. Ancak, yukarıda listelenen tüm istisnalar, tek yararlı düzeltmeyi büyük bir uyarı oluşturmak ve uygulamayı durdurmaktır.
Daha fazla istisna sınıfı hataya özel bilgilerin bir dize mesajı veya hata kodu yerine istisna içine gömülmesine izin verir
Bu, istisnaları kullanmak için harika bir nedendir. Ancak bilgi önbelleğe alan kişi için yararlı olmalıdır. Bilgileri bazı düzeltici eylemleri gerçekleştirmek için kullanabilirler mi? Nesne kitaplığınızın içindeyse ve herhangi bir API'yi etkilemek için kullanılamıyorsa, bilgiler işe yaramaz. Atılan bilgilerin, onu yakalayabilen kişiye faydalı bir değere sahip olması konusunda çok spesifik olmanız gerekir. Onu yakalayan kişi genellikle herkese açık API'nızın dışındadır, bu nedenle herkese açık API'nızdaki şeylerle kullanılabilmesi için bilgilerinizi özelleştirin.
Tek yapabilecekleri istisnayı günlüğe kaydetmekse, çok fazla veri yerine bir hata mesajı atmak en iyisidir. Yakalayıcı genellikle verilerle bir hata mesajı oluşturacaktır. Hata mesajını oluşturursanız, tüm alıcılarda tutarlı olacaktır, eğer yakalayıcının hata mesajını oluşturmasına izin verirseniz, aynı hatayı kimin aradığını ve yakaladığına bağlı olarak farklı şekilde bildirebilirsiniz.
Daha az istisna, ancak arama olarak kullanılabilecek bir hata kodu gömme
Hata kodunun anlamlı bir şekilde kullanılabileceği hava durumunu belirlemelisiniz. Eğer yapabilirse, kendi istisnasına sahip olmalısınız. Aksi takdirde, kullanıcılarınızın artık bu catch içinde anahtar deyimleri uygulaması gerekir (bu, catchin otomatik olarak işlenmesinin tüm noktasını yener).
O zaman neden istisnada bir hata mesajı kullanmıyorsanız (kodu ve mesajı bölmeye gerek yoktur, bu onu aramak için acı verir).
Hata kodlarını ve bayrakları doğrudan işlevlerden döndürme (bazen iş parçacıklarından mümkün olmayabilir)
Hata kodlarını döndürmek dahili olarak harika. Buradaki hataları düzeltmenize izin verir ve tüm hata kodlarını düzelttiğinizden ve bunları hesaba kattığınızdan emin olmanız gerekir. Ancak herkese açık API'nızda sızdırmak kötü bir fikirdir. Sorun, programcıların genellikle hata durumlarını kontrol etmeyi unutmalarıdır (en azından bir istisna dışında, kontrol edilmemiş bir hata, uygulamayı işlenmeyen bir hatadan çıkmaya zorlar) genellikle tüm verilerinizi bozar).
Hata durumunda bir olay veya geri çağrı sistemi uygulandı (yığın çözülmesini önler)
Bu yöntem genellikle diğer hata işleme mekanizmalarıyla birlikte kullanılır (alternatif olarak değil). Windows programınızı düşünün. Kullanıcı bir menü öğesi seçerek bir eylem başlatır. Bu, olay kuyruğunda bir eylem oluşturur. Olay kuyruğu sonunda eylemi işlemek için bir iş parçacığı atar. İş parçacığının eylemi gerçekleştirmesi ve sonunda iş parçacığı havuzuna dönmesi ve başka bir görev beklemesi gerekir. Burada işle görevlendirilmiş iş parçacığı tarafından tabana bir istisna yakalanmalıdır. Kural dışı durumun yakalanması sonucu genellikle ana döngü için oluşturulan ve sonuçta kullanıcıya bir hata mesajının görüntülenmesine neden olan bir olayla sonuçlanır.
Ancak istisna karşısında devam edemezseniz, yığın gevşeyecektir (en azından iş parçacığı için).