Ale tohle je přece něco naprosto jiného! Tady se bavíme o výjimkách jakožto syntaktické konstrukci v jazyce. Ne o výjimkách jakožto přerušení hlavního programu hardwarem.
Nevím, co je naprosto jiného, protože já píšu právě o výjimkách jakožto syntaktické konstrukci v jazyce a odpovídající implementaci v přeloženém kódu.
Fragmenty typu if ((m = malloc(...))) nebo if ((f = fopen(...))) považuju za céčkové idiomy. Existují samozřejmě i chyby v alokaci jiného typu (lokální automatická data), ale to opět principiálně s jazykovými výjimkami nesouvisí.
Ano, jsou to céčkové idiomy, ale to bohužel nezaručuje, že nenajdete kód bez toho ošetření. S jazykovými výjimkami to souvisí tak, že v céčku chybový stav můžete zachytit, když chcete – a když ne, tak chybu typicky hned v následujícím řádku kódu zazdíte. Výjimky jako jazyková konstrukce zajišťují, že nemůžete pouhým opomenutím chybový stav ignorovat – pokud výjimku neošetříte, probublá až někam do hlavní metody a (typicky) ukončí program. Pokud chcete takovou výjimku zazdít, musíte se aspoň trochu snažit.
Chyba se nejlépe ošetřuje právě tam, kde vzniká.
To vůbec není pravda. Místo vzniku výjimky a místo jejího ošetření spolu nijak nesouvisí – někdy to může být to samé místo, někdy je to někde úplně jinde.
Ty na hlídání alokací kašleš?
Ne. A výjimky mi dost usnadňují na něj nekašlat.
Taková chyba principiálně nemůže nestat. Transportní vrstva dodá buď bezchybnou zprávu, nebo nějakou chybu typu timeout při příjmu. Ale co je na tom výjimečného? To je na transportní vrstvě zrovna tak "normální" stav, jako poškozená zpráva na síťové vrstvě.
Výjimky nejsou výjimečné tím, že by k nim docházelo výjimečně málo často, ale tím, že je to výjimka z normálního běhu programu, odchylka od toho, co chci, aby program dělal. K chybám při síťovém transportu může docházet hodně často, ale program je dělaný proto, aby data úspěšně přenášel – neúspěšný přenos je odchylka od tohoto žádaného stavu, proto je to výjimka.