İ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):

  1. 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.
  2. 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.
  3. 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.
  4. İ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 insert iş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  [ ru ] deyimi). Bu durumda, sokma ya da x içine v başarılı ya da v ayı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, insert işlev tamamen serbest bırakabilir v ve sayım alanını sıfırlayabilir. Başarısızlık durumunda hiçbir kaynak sızdırılmaz, ancak v eski 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

  1. ^ David Abrahams . "Genel Bileşenlerde İstisna-Güvenlik" . Erişim tarihi: 2008-08-29 .
  2. ^ 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 .
  3. ^ 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 )
  4. ^ http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1997/N1077.asc

Dış bağlantılar