Exceptions: To throw or not to throw?

Vyjímky (kousek mého zápočťáku)Zhruba před rokem proběhla na internetu menší debata o tom, zda je v kódu vhodnější používat vyjímky nebo nebo staré dobré chybové návratové kódy. Náhodou jsem ji dnes znovu objevil, tak jsem se rozhodl o ní zmínít.

Problém vyjímek tkví v tom, že ztěžují čtení a analýzu kódu, protože narušují jeho plynulý tok (přesněji řečeno, zvětšují množství možných výstupních bodů z funkce, přičemž tyto body nejsou v kódu vůbec vidět). Na druhou stranu ošetřování chybových kódů zas kód neskutečně prodlužuje a vede k tomu, že programátoři na ošetřování kašlou. (Viděli jste třeba někdy ošetřenou návratovou hodnotu z funkce fclose? Já krom matfyzáckého cvičení z céčka nikdy.)

Osobně v tomto sporu stojím na straně vyjímek, a to zejména z jednoho velmi pragmatického důvodu: Pokud ignorujete vyjímku, probublá nakonec až kamsi do defaultního handleru a pravděpodobně shodí program – čili je vidět. Pokud ignorujete chybový kód, program se bude tvářit, že je vše v pořádku, i když to není pravda – a můžete snadno skončit třeba s nekonzistentními daty v souboru. Je asi zřejmé, která z možností je lepší.

Tak, a teď odkazy na příspěvky k loňské debatě (krom posledního jsou chronologicky seřazené):

  1. Exceptions (Joel On Software)
  2. Exceptions vs. status returns (Ned Batchelder)
  3. DoSomething() (Joel On Software)
  4. Exceptions in the rainforrest (Ned Batchelder) – tenhle článek je mimochodem mnohem víc o designu programů než o vyjímkách
  5. Diskuze k tématu na Joelově diskuzním fóru
6. 10. 2004, 0:57

RSS komentářů k článku Komentáře


Mormegil

6. 10. 2004, 10:44

Ano, ale ti programátoři, kteří rutinně ignorovali chybové kódy, udělají co?
try { xyz() } catch(...) {}

A mmch já bych byl zastáncem vÝjImek (jakkoli se to zdá nelogické, je to tak).

david.majda@seznam.cz

David Majda

6. 10. 2004, 11:02

[1] Ano, v Javě, kde jsou checked exceptions, je tohle časté. To je pravda. Ale skoro všechny ostatní jazyky s vyjímkami si na jejich neošetření nestěžují a tedy dojde k probublání nahoru.

Mimochodem, i v té Javě se dá při extrémní lenosti psát místo uvedené konstrukce toto (ne že bych to tedy doporučoval, to ani omylem):

void f() throws Exception {
xyz();
}

Námahou to vyjde tak nastejno, jako prázdný catch.

Mimochodem, prázdný catch je už *vědomé* potlačení chybového stavu poté, co vás kompilátor upozornil na to, že je nutné vyjímku ošetřit. Ignorování chybového kódu je většinou *nevědomé* - vzniklé přehlédnutím či neinformovaností, že to vůbec může selhat. Vyjímku v Javě přehlédnout nejde.

Ještě k pravopisu: Ano, vím že se to správně píše "výjimka". Ale je jedno z mála pravidel českého pravopisu, které mi přijde tak strašně nelogické, že ho ignoruju a píšu si to po svém. Zatím mi nikdo nevysvětlil, jak ten úchylný správný tvar vzniknul a proč vypadá tak jak vypadá (tím neříkám, že jsem se po tom nějak zvlášť pídil...).

wood-stock@seznam.cz

Woodstock

6. 10. 2004, 18:29

Jen k tomu pravopisu - nebude to odvozeno od slova "výjimečný"? Tedy ne od slova "jímat" nebo "jímka". :-)

david.majda@seznam.cz

David Majda

6. 10. 2004, 18:42

[3] A co spíš "vyjímat" (od "vyjmout")? IMHO je to utvořené předponou "vy" a kořenem "jímat/jmout" (podobně jako třeba u slova "pojmout"). Odtud bych i odvozoval svůj pravopis.


dgx

7. 10. 2004, 1:07

tipnul bych si, že "vyjímka" bude součástí dalšího vydání Pravidel.

david.majda@seznam.cz

David Majda

7. 10. 2004, 1:14

Zajímavé, jak se tu ta diskuze zvrtla :-)

Každopádně jsem o tom celém mluvil s kamarádkou, co studuje češtinu na FF UK, a nabídla mi, že se koukne do etymologického slovníku. Jestli na to já nebo ona nezapomeneme, tak sem pak napíšu, co zjistila.


Standa

8. 10. 2004, 15:47

Skutecne je to spravne "výjimka" :-)

david.majda@seznam.cz

David Majda

9. 10. 2004, 14:56

[7] Vždyť jo - mě jen není jasné, proč je to zrovna tahkle.


Miloslav Ponkrác

9. 10. 2004, 16:45

Já osobně taky dávám přednost výjimkám při ošetřování chyb. Má to spoustu předností oproti klasickému řešení, kdy se vrací chyba jako status kód.

Především chyba se nedá ignorovat, kód je čistější a čitelnější, ošetřovat chyby je možné na místě, kde je to potřeba, atd. atd.


Přidat komentář

Komentáře k článkům starším než měsíc jsou automaticky uzavřeny. Pokud mi chcete něco sdělit, využijte sekci kontakt.