İstisnalarla uğraşmanın "özünde" neredeyse her şeyin yıkıcılar aracılığıyla temizlenmesi gerekir. Örneğin, bir nesneyi "yeni" yazarsanız "ham" işaretçisi alırsınız; Bir istisna bir yere atılırsa, bu ham işaretçinin düzgün bir şekilde "sil" dendiğinden emin olmalısınız, ancak başlatılmamış bir ham işaretçiyi silmediğinizden emin olun.
Bu işaretçiyi std :: unique_ptr içine kaydederseniz, hiçbir şey yapmanız gerekmez; unique_ptr yok olduğunda, nesne silinir ve nesne-imha otomatik olarak gerçekleşir: unique_ptr kapsam dışına çıktığında, derleyici temizleme, tümüyle görünmez (bu yüzden daha fazla kod temizleme ve tonlama temizleme çağrıları ile) ve otomatik olarak çağırır (böylece Artık hiç kimsenin, hiç kimsenin test etmediği nadir bir yol olduğu zaman, temizlemeyi unuttuğuna inanıyorum ”.
Aynı şey hemen hemen her kaynağa uygulanabilir; COM nesneleri için "otomatik işaretçiler" vardır (örneğin, DirectX'te kullanıldığı gibi), çoğu çerçeve muteksleri etrafına sarmak için bir "scoped lock" -type nesnesi vermelidir (böylece nesne oluşturulduğunda mutex kilitlenir ve imha edildiğinde kilidini açar) ve çeşitli Windows tutamaçlarıyla başa çıkmak için küçük paketler yazabilirsiniz.
Temel olarak, tüm temizlemenizi yıkıcılara yerleştirirseniz, sadece temizlemek için "... yakalamaya, yeniden işlemeye" gerek yoktur. Ve “daha büyük” nesnelerin yıkıcıları, çoğu zaman, “içerilen” nesnelerin neredeyse tamamı kendi yıkıcıları tarafından otomatik olarak temizlendiğinden, çok basit olacaktır.
Link hakkında, Als size burada verir http://stackoverflow.com/questions/12723492/how-to-clean-initialized-resources-if-exception-thrown-from-constructor-in-c? Bu üyeler üye nesneler mi? – ForEveR
Hangi işleme ihtiyacınız var? Normal olarak, istisnanın yayılmasına izin verirsiniz, böylece ilk 5 nesne temiz bir şekilde yok edilir. Bazı daha fazla bağlam yararlı olabilir – jalf
RAII. (Http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization) – ScaryAardvark