Ana Sayfa

C++'ın Kendi "finally" Yaklaşımı

1 dk okuma

Çoğu modern programlama dili, istisna yönetimi için try...finally yapısını sunar. Java, C#, Python ve JavaScript gibi dillerde bulunan bu yapı, try bloğundan kontrol çıktığında belirli bir kod bloğunun her zaman çalışmasını garanti eder. Ancak C++, doğrudan bir finally anahtar kelimesine sahip değildir. C++'ta bu işlevsellik, kaynak yönetimi için yaygın olarak kullanılan "Resource Acquisition Is Initialization" (RAII) prensibi sayesinde yıkıcılar (destructor) aracılığıyla sağlanır. Bir nesnenin yıkıcısı, kapsam dışına çıkıldığında otomatik olarak çağrılır ve bu sayede finally benzeri bir davranış elde edilir. Örneğin, Windows Implementation Library (WIL) wil::scope_exit gibi yapılarla bu yaklaşımı somutlaştırır.

finally bloğu veya yıkıcının kendisinin bir istisna fırlatması durumunda diller arasında davranış farklılıkları ortaya çıkar. Eğer korunan bloktan istisnasız çıkılırsa ve finally veya yıkıcı bir istisna fırlatırsa, bu istisna try bloğundan fırlatılmış gibi davranılır; bu konuda çoğu dil hemfikirdir. Ancak, korunan bloktan zaten bir istisna ile çıkılmışken, finally veya yıkıcının da bir istisna fırlatması durumunda durum karmaşıklaşır. Java, Python, JavaScript ve C# gibi dillerde, finally bloğundan fırlatılan yeni istisna, orijinal istisnayı ezer ve orijinal istisna kaybolur (Python 3.2'de orijinal istisna yeni istisnanın bağlamı olarak saklansa da, yine yeni istisna fırlatılır). C++'ta ise, bir istisna nedeniyle çalışan bir yıkıcının istisna fırlatması, programın otomatik olarak sonlandırılmasına neden olur.

Bu durum, C++'ın kapsam dışına çıkıldığında kod çalıştırma yeteneği sunmasına rağmen, bu kodun istisna fırlatmamasına dikkat edilmesi gerektiğini gösterir. Özellikle wil::scope_exit gibi yapılar, lambda'nın istisna fırlatması durumunda süreci sonlandıracağını belgelerinde belirtir. wil::scope_exit_log gibi alternatifler ise istisnaları kaydeder ve yok sayar, ancak Java benzeri bir davranış sunmaz. Bu farklılıklar, C++ geliştiricilerinin istisna güvenliği konusunda daha dikkatli olmalarını gerektirir.

İçgörü

C++'ın `finally` benzeri işlevselliği yıkıcılar aracılığıyla sağlaması ve istisna anında yıkıcılardan fırlatılan istisnaların programı sonlandırması, dilin istisna yönetimi paradigmalarının diğer dillerden önemli ölçüde farklılaştığını gösterir.

Kaynak