středa 12. prosince 2007

Do pranice: kontrolované vs. běhové výjimky

Napsal jsem, nebo lépe řečeno zrefaktoroval jsem, velké množství kódu, z kontrolovaných výjimek na běhové a všude to bylo ku prospěchu věci. Principiálně souhlasím s tím, že kontrolované výjimky mají své uplatněni a to tam, kde je z kontextu možné zotavení. Typickým příkladem jsou vstupy od uživatele. Těchto případů je možná 20%. Zbylých 80% jsou výjimky systémové-běhové, ze kterých se není schopen klient se v daném kontextu zotavit, příkladem budiž výpadek databázového stroje.

Největší nevýhodu kontrolovaných výjimek vidím v jejich invazivnosti do klientského API. Tato invazivnost způsobuje dva problémy: narušuje zpětnou kompatibilitu a ve většině případů vede k často se opakujícímu kódu (konverze výjimky na běhovou). Nicméně souhlasím s tím, že je potřeba mít ošetřenou práci s výjimkami, ale nemyslím si, že je nějaká extra výhoda to vynucovat kompilátorem. Naopak to spíše vede k anarchii v jejich ošetření.

I v případě běhových výjimek lze dosáhnout správného ošetření. Klíčem je centralizované místo (může to být aspekt), které se bude starat o chytání a zpracování výjimek. Další velice užitečnou technikou je použití takzvané deklarované běhové výjimky. Běhové výjimky jsou nadeklarovány v throws klauzuli, takže minimálně při pohledu na signaturu metody je vidět, k čemu může dojít.