Bir keresinde bir C ++ programının sonunda tüm istisnaları yakalaması gerektiği konusunda bilgilendirildim. O zaman verilen akıl yürütme, esasen istisnaların dışına taşmasına izin veren programların main()
garip bir zombi durumuna girmesiydi. Bunu birkaç yıl önce söylemiştim ve geçmişe bakıldığında gözlemlenen olgunun, söz konusu projeden elde edilen istisnai olarak büyük çekirdek döküntülerinin uzun neslinden kaynaklandığına inanıyorum.
O zaman bu tuhaf görünüyordu ama inandırıcıydı. C ++ 'ın programcıları tüm istisnaları yakalamadıkları için "cezalandırması" tamamen saçmalıktı ancak benden önceki kanıtlar bunu destekliyor gibi görünüyordu. Söz konusu proje için, yakalanmamış istisnalar atan programlar, garip bir zombi durumuna giriyor gibi görünüyordu - ya da sebebin şimdi olduğundan şüphelendiğimde, istenmeyen bir çekirdek dökümü ortasında bir işlemi durdurmak alışılmadık bir şekilde zor.
(Bunun neden o zaman daha açık olmadığını merak eden herkes için: Proje, herhangi bir aborted (core dumped)
mesaj türünü etkili bir şekilde gizleyen çoklu işlemlerde çok sayıda çıktı üretti ve bu özel durumda, çekirdek dökümlerin ölüm sonrası incelemesi yapıldı. önemli bir hata ayıklama tekniği olmadığından çekirdek döküntüler çok fazla düşünülmemişti.Bir programla ilgili sorunlar genellikle uzun süren bir program tarafından zaman içinde biriktirilen duruma değil, kısa süren bir programın ilk girdilerine bağlıdır (< 1 saat) bu nedenle, daha fazla bilgi edinmek için aynı hata ayıklama yapısındaki veya hata ayıklayıcısındaki aynı girişlerle bir programı yeniden çalıştırmak daha pratikti.)
Şu anda, istisnaları tamamen engellemek amacıyla istisnaları yakalamanın büyük bir avantajı veya dezavantajı olup olmadığından emin değilim main()
.
İstisnaların geçmişte kabarmasına izin verebileceğim için düşünebildiğim küçük avantaj main()
, sonucun std::exception::what()
terminale yazdırılmasına neden olmasıdır (en azından Linux'ta gcc derlenmiş programlarla). Öte yandan, bu yerine türetilen tüm özel durumları yakalamak oluşturulamayan önemsiz olduğunu std::exception
ve sonucunu baskı std::exception::what()
ve elde edilmemiş ise bir istisna gelen bir iletiyi yazdırmak için arzu varsa std::exception
o zaman gerekir ayrılmadan önce yakalanmış main()
baskı için mesaj.
İstisnaların geçmişte kabarmasına izin vermek için düşünebildiğim en mütevazı dezavantaj main()
, istenmeyen çekirdek döküntülerinin üretilebilmesidir. Çok miktarda bellek kullanan bir işlem için bu oldukça rahatsız edici olabilir ve bir programdan çekirdek boşaltma davranışını kontrol etmek, işletim sistemine özgü işlev çağrıları gerektirir. Diğer taraftan, eğer bir çekirdek dökümü ve çıkışı istenirse, bunun yerine herhangi bir zamanda çağırarak elde edilebilir std::abort()
ve çekirdek dökümü olmayan bir çıkış, herhangi bir zamanda çağırarak elde edilebilir std::exit()
.
Önceden what(): ...
, çökme üzerine yaygın olarak dağıtılan bir program tarafından basılan varsayılan mesajı hiç görmedim sanmıyorum .
Varsa, C ++ istisnalarının geçmişe doğru kabarmasına izin verilmesi konusundaki güçlü argümanlar main()
nelerdir?
Düzenleme: Bu sitede çok sayıda genel istisna sorun var. Sorum özellikle işlenemeyen ve başaramayacağı özel durumlar olan C ++ ile ilgili main()
- belki bir hata mesajı basılabilir, ancak bu hemen gösterme durma hatasıdır.