C ++ programcıları istisna spesifikasyonlarını aramazlar. İstisna garantileri ararlar.
Bir kod parçasının bir istisna attığını varsayalım. Programcı bunun hala geçerli olacağını hangi varsayımlarla yapabilir? Kodun yazıldığı şekliyle kod, bir istisna sonrasında ne garanti ediyor?
Veya, belirli bir kod parçasının asla atılmamasını garanti edebileceği (yani, işletim sistemi işleminden başka hiçbir şeyin sonlandırılmadığı) mümkün mü?
İstisnalarla ilgili tartışmalarda "geri alma" kelimesi sıklıkla ortaya çıkıyor. Geçerli bir duruma (açıkça belgelenmiştir) geri dönebilmek bir istisna garantisi örneğidir. İstisna garantisi yoksa, bir program derhal sona ermelidir, çünkü daha sonra çalıştırılan herhangi bir kodun amaçlandığı gibi çalışacağı garanti edilmez - örneğin, eğer bellek bozulursa, başka bir işlem teknik olarak tanımsız davranıştır.
Çeşitli C ++ programlama teknikleri istisna garantileri sunar. RAII (kapsam tabanlı kaynak yönetimi), temizleme kodunu yürütmek ve kaynakların hem normal durumlarda hem de istisnai durumlarda serbest bırakılmasını sağlamak için bir mekanizma sağlar. Nesnelerde değişiklik yapmadan önce verilerin bir kopyasını almak, işlemin başarısız olması durumunda kişinin bu nesnenin durumunu geri yüklemesine izin verir. Ve bunun gibi.
Bu StackOverflow sorusuna verilen cevaplar, C ++ programcılarının kodlarında olabilecek tüm olası arıza modlarını anlamaya ve başarısızlıklarına rağmen program durumunun geçerliliğini korumaya çalışmasına büyük ölçüde bir fikir verir. C ++ kodunun satır bazında analizi alışkanlık haline gelir.
C ++ 'da (üretim kullanımı için) geliştirilirken, detaylardan bahsedemezsiniz. Ayrıca, ikili blob (açık kaynaklı olmayan) C ++ programcılarının ağzıdır. İkili blob çağırmam gerekiyorsa ve blob başarısız olursa, o zaman tersine mühendislik C ++ programcısının yapacağı şeydir.
Referans: http://en.cppreference.com/w/cpp/language/exceptions#Exception_safety - İstisna Güvenliği bölümüne bakın.
C ++ istisna spesifikasyonlarını uygulamada başarısız oldu. Diğer dillerde daha sonra yapılan analizler istisna şartnamelerinin pratik olmadığını söylüyor.
Neden başarısız bir girişim: kesinlikle zorla uygulamak için tip sisteminin bir parçası olmak zorunda. Ama öyle değil. Derleyici özel durum belirtimi için denetleme yapmaz.
Neden C ++ bunu seçti ve neden diğer dillerden (Java) elde edilen deneyimler istisna şartnamesinin suçlu olduğunu kanıtladı: Birinin bir işlevinin uygulanmasını değiştirdiği gibi (örneğin, yeni bir tür atabilecek başka bir işlevi çağırması gerekir) istisna), katı bir istisna şartname uygulaması, bu şartnameyi de güncellemeniz gerektiği anlamına gelir. Bu yayılır - basit bir değişiklik olan düzinelerce veya yüzlerce fonksiyon için istisna şartnamesini güncellemeniz gerekebilir. Soyut temel sınıflar için (işlerin C ++ eşdeğeri) durumları kötüye gider. Arayüzlerde istisna şartnamesi uygulanırsa, arayüz uygulamalarının farklı istisna türleri atan fonksiyonları çağırmasına izin verilmez.
Referans: http://www.gotw.ca/publications/mill22.htm
C ++ 17 ile başlayarak, [[nodiscard]]
öznitelik, işlev dönüş değerlerinde kullanılabilir (bkz. Https://stackoverflow.com/questions/39327028/can-ac-function-be-declared-such-that-the-return-value göz ardı edilemez .
Öyleyse, bir kod değişikliği yaparsam ve bu yeni bir tür arıza koşulu ortaya çıkarırsa (örneğin yeni bir istisna türü), bu bir değişiklik mi? Arayan kişiyi kodu güncellemeye mi zorlamalıydı yoksa en azından değişiklik konusunda uyarılmalı mıydı?
C ++ programcılarının istisna spesifikasyonları yerine istisna garantileri aradığı argümanlarını kabul ederseniz, cevap, yeni tür bir arıza koşulu istisnaların hiçbirini bozmazsa, daha önce vaat ettiğiniz kodu garanti etmez, bunun kesin bir değişiklik olmadığıdır.