Sorununuz kendi kötü kodunuzdan kaynaklanıyorsa, buna karşı korunmak için ASSERT kullanmak daha iyidir. Programın üstesinden gelemediği sorunları belirlemek ve bunları kullanıcı hakkında anlatmak için istisna işleme gereklidir, çünkü kullanıcı bunları halledebilir. Ancak programınızdaki hatalar kullanıcının başa çıkabileceği bir şey değildir, bu nedenle programın çökmesi pek bir şey söylemez
Kabul edilen cevabın bu yönüne katılmıyorum . Bir iddia, bir istisna atmaktan daha iyi değildir. İstisnalar yalnızca çalışma zamanı hataları (veya "harici sorunlar") için uygunsa, ne işe yarar std::logic_error
?
Mantık hatası, neredeyse tanımı gereği bir programın devam etmesini engelleyen koşul türüdür. Program mantıksal bir yapı ise ve bu mantığın etki alanı dışında bir koşul meydana gelirse, nasıl devam edebilir? Elinizden geldiğince girdiler toplayın ve bir istisna atın!
Önceki sanat yok gibi değil. std::vector
, ancak birini adlandırmak gerekirse, bir mantık hatası istisnası atar std::out_of_range
. Eğer standart kütüphane kullanma ve standart istisnaları yakalamak için üst düzey bir işleyici yoksa - çağırmak üzere yalnızca neyi () ve çıkış (3) - ardından programlar ani sessiz, fesih tabidir.
İddia makrosu çok daha zayıf bir korumadır. İyileşme yok. Diğer bir deyişle, bir hata ayıklama derlemesi çalıştırmıyorsanız, bu durumda yürütme olmaz . İddia makrosu, hesaplamanın bugünkünden 6 kat daha yavaş olduğu bir çağa aittir. Mantık hatalarını test etme zahmetine girecek, ancak önemli olduğunda bu testi kullanmayacaksanız, üretimde, kodunuza çok güvenmeniz iyi olur!
Standart kütüphane, mantık hatası istisnaları sağlar ve bunları kullanır. Bir sebepten dolayı oradalar: çünkü mantık hataları meydana gelir ve istisnaidir. Sırf C'nin iddiaları öne çıkarması, bir istisna işi çok daha iyi ele aldığında, böylesine ilkel (ve tartışmasız, yararsız) bir mekanizmaya güvenmek için bir neden değildir.