A preco by sa mal server zlozit, ked nieco nefunguje? Pri chybe nie je vzdy nutne vyhadzovat vynimku - vsak su aj Cckoidne riesenia chyby. Niekedy staci goto, inokedy je mozne vratit chybovy stav (ci uz hnusne cez zdielanu premennu - errno) alebo navratovou hodnotou alebo ulozenie niecoho na pointer dodany v parametroch.
protože
void readPage(Request *r) {
char buffer[1000];
FILE *f = fopen(r->pathname,"r");
int i = fread(buffer, 1000,1,f); //crash SIGSEGV
//...
fclose(f);
}
ale
void readPage(Request *r) {
char buffer[1000];
FileStream f(r->pathname); //exception - FileNotFound exception
int i = f.read(buffer, 1000);
//...
}
... {
try {
readPage(r);
} catch (FileNotFoundException &e) {
errorPage(404);
} catch (...) {
errorPage(500);
}
}
Jasně, Cckové řešení vyžaduje ošetřit návratovou hodnotu z fopen. A pak nějak vrátit chybový kód tomu volajícímu. Výjimka takové povinnosti eliminuje. Ať už funkce readPage dělá cokoliv (může být abstraktní, implementovaná v potomkovi), pokud vyhodí FileNotFoundException, pošlu na výstup status 404 Not found. Všimněte si také, že výjimkové řešení bude o několik řádek kratší. A v neposledním případě, výjimkové řešení je rychlejší, protože kód neobsahuje zbytečné testy na každém rozcestí, obsahuje jen vyhodnocení místě vzniku chyby a pak vyhodnocení při výjimce. Výjimky se totiž řeší bokem, mimo hlavní kód... tedy vrací se jinou cestou, než původní kód.