Sürüm yapılarının performansını etkilemeden hata ayıklamayı kolaylaştırmak için C ++ koduma çok sayıda iddia ekleme eğilimindeyim. Şimdi, assert
akılda C ++ mekanizmaları olmadan tasarlanmış saf bir C makrosu.
Öte yandan C ++ std::logic_error
, programın mantığında (dolayısıyla adı) bir hata olduğu durumlarda atılması amaçlanan tanımlar . Bir örnek fırlatmak sadece mükemmel, daha C ++ ish alternatifi olabilir assert
.
Sorun şu ki assert
ve abort
her ikisi de yıkıcıları çağırmadan programı hemen sonlandırıyor, bu nedenle temizleme işlemini atlamak, manuel olarak bir istisna atıldığında gereksiz çalışma süresi maliyetleri ekliyor. Bunu aşmanın bir yolu SAFE_ASSERT
, aynı C muadili gibi çalışan, ancak başarısızlık durumunda bir istisna atan kendi onaylama makrosu oluşturmaktır .
Bu sorunla ilgili üç fikir düşünebilirim:
- C'nin iddiasına sadık kalın. Program hemen sonlandırıldığı için, değişikliklerin doğru şekilde silinip silinmediği önemli değildir. Ayrıca,
#define
C ++ 'da s kullanmak da aynı derecede kötüdür. - Bir istisna atın ve main () 'de yakalayın . Programın herhangi bir durumunda kodun yıkıcıları atlamasına izin vermek kötü bir uygulamadır ve her ne pahasına olursa olsun önlenmelidir ve sonlandırma () çağrıları da öyle. İstisnalar atılırsa, yakalanmaları gerekir.
- Bir istisna atın ve programı sonlandırmasına izin verin. Bir programı sonlandıran bir istisna tamamdır ve
NDEBUG
bu nedenle, bu asla bir sürüm yapısında olmayacaktır. Yakalama gereksizdir ve dahili kodun uygulama ayrıntılarınımain()
.
Bu soruna kesin bir cevap var mı? Herhangi bir profesyonel referans var mı?
Düzenlendi: Yıkıcıları atlamak elbette tanımlanmamış bir davranış değildir.
logic_error
mantık hatasıdır. Programın mantığındaki bir hata, hata olarak adlandırılır. Hataları istisnalar atarak çözemezsiniz.