İstisnai güvenlik - Exception safety
Başlangıçta David Abrahams tarafından resmileştirilen istisnai güvenlik garantileri, kütüphane uygulayıcılarının ve istemcilerin istisnaları, özellikle C ++ kullanan herhangi bir programlama dilinde istisna işleme güvenliği hakkında mantık yürütürken kullanabilecekleri bir dizi sözleşme kılavuzudur .
Birkaç istisna güvenlik seviyesi vardır (azalan güvenlik sırasına göre):
- Arıza şeffaflığı olarak da bilinen atışsız garanti : Operasyonların başarılı olması ve istisnai durumlarda bile tüm gereksinimleri karşılaması garanti edilir. Bir istisna meydana gelirse, dahili olarak ele alınacak ve müşteriler tarafından gözlemlenmeyecektir.
- Tamamlama veya geri alma semantiği olarak da bilinen güçlü istisna güvenliği : İşlemler başarısız olabilir, ancak başarısız işlemlerin hiçbir yan etkisi olmayacağı ve orijinal değerleri olduğu gibi bırakacağı garanti edilir.
- Sızdırmazlık garantisi olarak da bilinen temel istisna güvenliği : Başarısız işlemlerin kısmi olarak yürütülmesi yan etkilere neden olabilir, ancak tüm değişmezler korunur ve kaynak sızıntısı olmaz ( bellek sızıntıları dahil ). Saklanan herhangi bir veri, orijinal değerlerden farklı olabilecek geçerli değerler içerecektir.
- İstisna yok güvenlik : Garanti verilmez.
Genellikle, bu tür dillerde sağlam kod yazmak için en azından temel istisna güvenliği gerekir. Daha yüksek güvenlik seviyelerine ulaşmak bazen zor olabilir ve fazladan kopyalama nedeniyle ek yüke neden olabilir. İstisna güvenliği için önemli bir mekanizma, istisnalar finally da dahil olmak üzere belirli bir kodun bir bloktan çıkıldığında her zaman çalıştırılmasını sağlayan bir madde veya benzeri istisna işleme sözdizimidir . Çeşitli diller başta kullanarak, bu basitleştirmek yapıları var atmayın desen olarak adlandırılan, , veya -with-kaynaklar.
usingwithtry
Misal
C ++ 'lar veya Java'lar gibi akıllı bir vektör türünü düşünün . Bir vektöre bir öğe eklendiğinde , vektörün aslında dahili nesne listesine eklemesi ve içinde kaç tane nesnenin olduğunu belirten bir sayım alanını güncellemesi gerekir . Mevcut kapasite yeterli değilse yeni bellek ayırması da gerekebilir.
std::vectorArrayListxvxv
İstisnai güvenlik alternatifleri:
- Atışsız garanti
- Bellek ayırmanın asla başarısız olmamasını sağlayarak veya
insertişlevin ayırma hatası üzerindeki davranışını tanımlayarak uygulanır (örneğin, işlevin eklemenin gerçekleşip gerçekleşmediğini gösteren bir mantıksal sonuç döndürmesini sağlayarak). - Güçlü istisna güvenliği
- Öncelikle gerekli herhangi bir tahsisat yapılarak ve sonra herhangi bir hata ile karşılaşılmazsa tamponlar değiştirilerek uygulanır ( kopyala ve değiştir deyimi). Bu durumda, sokma ya da
xiçinevbaşarılı ya davayırma etmemesine rağmen değişmeden kalır. - Temel istisna güvenliği
- Sayım alanının nihai boyutunu yansıtması garanti edilerek uygulanır
v. Örneğin, bir hatayla karşılaşılırsa,insertişlev tamamen serbest bırakabilirvve sayım alanını sıfırlayabilir. Başarısızlık durumunda hiçbir kaynak sızdırılmaz, ancakveski değeri korunmaz. - İstisna güvenliği yok
- Bir ekleme hatası
v, içeriğin bozulmasına , sayım alanında yanlış bir değere veya bir kaynak sızıntısına neden olabilir .
Referanslar
- ^ David Abrahams . "Genel Bileşenlerde İstisna-Güvenlik" . Erişim tarihi: 2008-08-29 .
- ^ Dave Abrahams (2000). Genel Bileşenlerde İstisna-Güvenlik . Genel Programlama . Bilgisayar Bilimi Ders Notları . 1766 . Springer . s. 69–79. doi : 10.1007 / 3-540-39953-4_6 . ISBN 978-3-540-41090-4 .
-
^ Bjarne Stroustrup . "Ek E:" C ++ Programlama Dili " nde Standart Kitaplık İstisnası Güvenliği " (3. baskı). Addison-Wesley. ISBN 0-201-88954-4 . Eksik veya boş
|url=( yardım ) - ^ http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1997/N1077.asc
Dış bağlantılar
- Herb Sutter: Olağanüstü C ++: 47 Mühendislik Bulmacası, Programlama Problemleri ve Çözümleri, 2000
- Jon Kalb: Şimdi C ++ ile C ++ 'da İstisna-Güvenli Kodlama ! İstisna güvenliği ile ilgili 2012 sunumları.
- Stackoverflow ile ilgili tartışma: C ++: (gerçekten) istisna korumalı kod yazıyor musunuz?