Výjimka (programování)Výjimka (anglicky exception) je v programování výjimečná situace, která může nastat za běhu programu. Jedná se o zobecnění vnitřního přerušení vyvolaného chybou při provádění programu. Ve vyšších programovacích jazycích je obvykle výjimka spojena s objektem nesoucím informace o chybovém stavu. Historie a současnost výjimekPrvním rozšířeným jazykem, který disponoval zpracováním výjimek, je jazyk PL/I společnosti IBM z roku 1964, který implementoval výjimky jako mechanismus pro zpracování neobvyklých ( Zpracování výjimekVe většině vyšších programovacích jazyků, které podporují zpracování výjimek, je implicitně (blok) nebo explicitně (např. klíčovým slovem Přístupy k použití výjimek a jejich zpracováníVyužití výjimek a jejich zpracování není pro všechny programovací jazyky vždy stejné a přístup k nim se liší i mezi jednotlivými programátory. Typickým přístupem prosazujícím použití výjimek je tzv. Defenzivní programování, které se vyznačuje snahou o ošetření všech neočekávaných stavů, ke kterým by mohlo za běhu programu dojít. V opozici k defenzivnímu programování stojí do značné míry kontraktové programování, které se zakládá na předpokladu, že je nutné pouze zajistit stavy, které nejsou ošetřeny kontraktem nebo zadáním. Jako příklad můžeme použít např. algoritmus pro výpočet odmocniny, který předpokládá, že mu nikdy nebude předáno v parametru záporné číslo. V případě defenzivního programování by toto bylo ošetřeno v kódu, v případě programování podle kontraktu by tento předpoklad byl zakotven v zadání. Používání výjimek má ve světě i své odpůrce, jedním z nich je např. Sir Charles Antony Richard Hoare, který označuje používání výjimek za potenciálně nebezpečné.[3] Svůj názor vyslovil v roce 1980 v rámci Turing Award Lecutre a podpořil jej výrokem „Příští raketa, která se odchýlí z kurzu v důsledku chyby programu, nemusí být výzkumná vesmírná raketa směřující k Venuši. Může jít o jadernou střelu vybuchující nad jedním z našich měst.”[4] Pozdější pád rakety Ariane 5 (let 501) v roce 1996 v důsledku chyby programu po startu jeho obavy potvrdil. Nehoda nastala v důsledku nedostatečného pochopení a přílišného spoléhání se na ošetření výjimek v programovacím jazyku Ada, který byl použit v navigačním software rakety.[5] Podpora výjimek v programovacích jazycíchMezi programovací jazyky s podporou zpracování výjimek patří Ada, C++, C# a jiné programovací jazyky platformy .NET, Eiffel, Java, Object Pascal (např. Delphi), PHP verze 5a vyšší, Prolog, Python, Ruby. Zpracování výjimek ve většině těchto programovacích jazyků neobnovuje zpracování v místě, kde k výjimce došlo; běžně se zpětně prochází zásobník, až je nalezeno zpracování příslušné výjimky. Abstrahujeme-li od drobných syntaktických rozdílů, existuje velmi málo přístupů ke zpracování výjimek na úrovni zdrojového kódu. Nejrozšířeněji je proces zpracování výjimky spuštěn klauzulí „throw“ nebo „raise“, případně objektem výjimky. Blok s výjimkou obvykle začíná klauzulí „try“ nebo „begin“, jednotlivé chybové stavy jsou poté označeny bloky „catch“ nebo „except“. Celý blok zpracování výjimky je ukončen sekcí „finally“ nebo „ensure“, která slouží pro uvolnění systémových zdrojů použitých při zpracování výjimky. Zpracování výjimek (v pseudokódu podobném jazyku Java) může vypadat např. takto: try {
line = console.readLine();
if (line.length() == 0) {
throw new EmptyLineException("The line read from console was empty!");
}
console.printLine("Hello %s!" % line);
console.printLine("The program ran successfully");
} catch (EmptyLineException e) {
console.printLine("Hello!");
} catch (Exception e) {
console.printLine("Error: " + e.message());
} finally {
console.printLine("The program terminates now");
}
Příklad použití výjimkyNásledující kód ukazuje deklaraci výjimky v jazyce ML a její následné použití v kódu a ošetření:[6] exception Factorial local fun fact 0 = 1 | fact n = n * fact (n-1) in fun checked_factorial n = if n >= 0 then fact n else raise Factorial end fun factorial_driver () = let val input = read_integer () val result = makestring (checked_factorial input) in print result end handle Factorial => print "Out of range.\n" Jak můžeme vidět, výjimka řeší situaci, kdy je funkci faktoriálu zadáno jako parametr záporné číslo (faktoriál záporného čísla neexistuje). V tomto případě program zobrazí chybovou hlášku „Out of range“ ve výstupním okně, které je implicitně zvoleno (obvykle se jedná o konzolový výstup). OdkazyReferenceV tomto článku byl použit překlad textu z článku Exception handling na anglické Wikipedii.
|