Výjimečná bezpečnost - Exception safety
Výjimečná bezpečnost záruky, původně[Citace je zapotřebí ] formalizováno David Abrahams,[1][2] jsou souborem smluvních pokynů, které mohou implementátoři knihoven a klienti použít při uvažování zpracování výjimek bezpečnost v jakémkoli programovacím jazyce, který používá výjimky, zejména C ++.
Existuje několik úrovní bezpečnosti výjimek (v sestupném pořadí podle bezpečnosti):[3]
- Záruka bez hodu, také známý jako průhlednost selhání: Je zaručeno, že operace uspějí a splní všechny požadavky i ve výjimečných situacích. Pokud dojde k výjimce, bude zpracována interně a nebude klienty dodržena.
- Silná bezpečnost výjimek, také známý jako sémantika potvrzení nebo vrácení zpět: Operace mohou selhat, ale je zaručeno, že selhané operace nebudou mít žádné vedlejší účinky, takže původní hodnoty zůstanou nedotčené.[4]
- Bezpečnost základních výjimek, také známý jako a záruka úniku: Částečné provedení neúspěšných operací může mít za následek vedlejší účinky, ale všechny invarianty jsou zachovány a nejsou žádné úniky zdrojů (počítaje v to úniky paměti ). Jakákoli uložená data budou obsahovat platné hodnoty, které se mohou lišit od původních hodnot.
- Bez výjimky bezpečnost: Nejsou poskytovány žádné záruky.
Pro psaní robustního kódu v těchto jazycích je obvykle vyžadována alespoň základní bezpečnost výjimek. Vyšší úrovně bezpečnosti může být někdy obtížné dosáhnout a může dojít k režii kvůli dalšímu kopírování. Klíčovým mechanismem pro bezpečnost výjimek je a Konečně
klauzule nebo podobné syntaxe zpracování výjimek, které zajišťují, že určitý kód je vždy spustit, když je blok ukončen, včetně výjimek. Několik jazyků má konstrukty, které to zjednodušují, zejména použití zlikvidovat vzor, pojmenovaný jako použitím
, s
nebo Snaž se
-s-prostředky.
Příklad
Zvažte inteligentní vektorový typ, například C ++ std::vektor
nebo Java ArrayList
. Když položka X
je přidán do vektoru proti
, vektor musí ve skutečnosti přidat X
do interního seznamu objektů a aktualizujte pole počtu, které říká, kolik objektů je v proti
. Možná nebude nutné přidělit novou paměť, pokud stávající kapacita není dostatečná.
Výjimečné bezpečnostní alternativy:
- Záruka bez hodu
- Implementováno zajištěním toho, že přidělení paměti nikdy selže, nebo definováním
vložit
chování funkce při selhání přidělení (například tím, že funkce vrátí logický výsledek označující, zda došlo k vložení). - Silná bezpečnost výjimek
- Implementováno nejprve provedením jakéhokoli nezbytného přidělení a poté výměnou vyrovnávacích pamětí, pokud nedojde k žádným chybám ( kopírování a výměna idiom). V tomto případě buď vložení
X
doproti
uspěje, neboproti
zůstává nezměněn navzdory selhání přidělení. - Bezpečnost základních výjimek
- Implementováno zajištěním toho, aby pole počtu zaručeně odráželo konečnou velikost
proti
. Například pokud dojde k chybě,vložit
funkce se může zcela uvolnitproti
a vynulujte jeho početní pole na nulu. Při selhání nedojde k úniku žádných zdrojů, aleproti
Stará hodnota není zachována. - Bez výjimky bezpečnost
- Selhání vložení může vést k poškození obsahu v
proti
, nesprávná hodnota v poli počítání nebo a únik zdrojů.
Reference
- ^ David Abrahams. „Výjimka - bezpečnost v generických součástech“. Citováno 2008-08-29.
- ^ Dave Abrahams (2000). Výjimečná bezpečnost v obecných součástech. Obecné programování. Přednášky z informatiky. 1766. Springer. str. 69–79. doi:10.1007/3-540-39953-4_6. ISBN 978-3-540-41090-4.
- ^ Bjarne Stroustrup. „Dodatek E: Bezpečnost výjimek ze standardní knihovny v“ programovacím jazyce C ++""(3. vyd.). Addison-Wesley. ISBN 0-201-88954-4. Chybějící nebo prázdný
| url =
(Pomoc) - ^ http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1997/N1077.asc
externí odkazy
- Herb Sutter: Exceptional C ++: 47 Engineering Puzzles, Programming Problems, and Solutions, 2000
- Jon Kalb: Výjimečně bezpečné kódování v C ++, nyní v C ++! Prezentace 2012 o bezpečnosti výjimek.
- Související diskuse o Stackoverflow: C ++: píšete (opravdu) bezpečný kód výjimky