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
Oct 6, 2004 – 0:57

Comments

Mormegil
Mormegil
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
[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...).
David Majda
[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.
David Majda
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.
Miloslav Ponkrác
Miloslav Ponkrác
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.

Add comment

It is not possible to add comments to posts older than one month.