Tak to máme s výjimkami opačné zkušenosti. Neošetřené výjimky se mi krásně ozývají už v testech a vzhledem k tomu, že mají společného rodiče, vím přesně co může házet. V C++ je to jinak - výjimky mohou být jakéhokoli typu a proto je v tom bordel, který popisuješ. O schopnostech GC nemám pochybnosti.
Jak mi bázová třída pomůže v tom poznat, jestli nějaká funkce může házet nebo ne? A ta javovská Exception je tak generická, že vím přesně akorát to, že to zvládnu zalogovat. Do teď jsem měl pocit, že se bavíme o primárně produkci. Pokud mám nějakou situaci pokrytou testy, tak mi chytí i zapomenutý test na návratovou hodnotu. Ale ty zapomenuté situace už z principu těmi testy moc pokryté nebývají.
V C++ je to úplně na stejno, protože v praxi nikdo nehází nic, co by nebylo odvozené od std::exception. Inty a podobné věci se házejí akorát v (mizerných) ukázkových prográmcích.
Já o schopnostech GC pochybnosti mám. Protože to, co je opravdu třeba uklidit rychle je právě "nepaměťový" binec. Soubory, sockety a další takové věci. Když po chycení chyby zůstane (potenciálně dost dlouho) viset zamčený soubor nebo otevřený socket, tak to není úplně OK.
Výjimečné chyby ošetříš o pár pater výš a vhledem k jednotnému rozhraní v tom nevidím žádný problém. Granularitu lze kdykoli zjemnit odchycením výjimky a uložením do stacku nové výjimky na vyšším levelu. Tím si zdroj výjimky krásně vytrasuješ.
Jednotné rozhraní čeho? Neznámou Exception můžu akorát tak převést na neznámý řetězec, ten zalogovat a pak zdechnout. To už můžu zavolat při jakékoliv chybě rovnou abort. V tom crashdumpu ten callstack dostanu taky.
To "ošetříš" znamená kód, který se díky tomu "výjímečné" moc často nespouští. Je opravdu dobře otestovaný? Netestují se náhodou jen běžné chyby?
Když upravíš jen kód nebo ošetření výjimek, tak tě na to testy hned upozorní. Toho bych se nebál.
Teoreticky jo. Ale v praxi jsou ty testy kapku míň spolehlivé. Testuje se to, co někoho napadne, nebo co už se jednou vymamlasilo. Na nečekané chyby testy nejsou.