Janoz schreef op maandag 10 december 2007 @ 08:43:
Mijn definitie van 'exceptioneel' is iets dat afwijkt van de nromale flow (en dan bedoel ik niet alleen de happy flow). Uiteraard ga ik niet userinput valideren middels exceptions (muv parseInt, maar vaak zit er al een masker op de input), maar [knip voorbeeld]
Ik denk niet dat je duidelijk kan definieren wanneer iets 'exceptioneel' is en wanneer niet. Waar jij zegt 'uiteraard', daar denken (of denken ze juist niet?) talloze anderen 'handig, ik gooi gewoon een exceptie', dan kan ik het 'ergens' afvangen.
[quote]imho hoort een methode gewoon het object terug te geven waar je hem om vraagt, en niet een statuscode die aangeeft dat die ene parameter die je hem meegeeft nu gevuld is met het resultaat.[/qquote]
Over het algemeen gebruik ik dan een object, dat resultaatcode en resultaat, met eventueel nog wat meta-informatie, wrapped.
Veel acties kunnen al worden ondernomen in de methode waar de exception voor het eerst optreed. Verder vraag ik me af of dat afhandelen daadwerkelijk duidelijker wordt wanneer het verstopt zit in een enorm geneste if boom van statuschecks.
Zoals ik in mijn eerste reactie op dawuss zei: dat is een vals dilemma. Het is niet òf exceptions, òf een enorme boom if's. Sterker nog: je kan zelfs
zonder if statements.
Transactie specifieke dingen kun je keurig op het niveau afhandelen waarop je ook met die transactie bezig bent, zonder dat je daar de exception daadwerkelijk af hoeft te handelen. Die kun je immers doorgooien, of je maakt een finaly blok. Op die manier kun je op elk niveau in de bijbehorende stack keurig je zaakjes opruimen en daar valt inderdaad ook een eventuele rollback onder.
Ja, maar het punt is dat je moet gaan achterhalen welke
rollback operaties je allemaal uit moet voeren om de
state van je programma te herstellen. Qua databases en de waarden van variabelen voor het blok is het niet zo moeilijk, maar als je ook bij moet gaan houden of files gewijzigd zijn, of bepaalde mails wel of niet verzonden zijn, etc., dan kan er aardig wat werk naar de exceptie afhandeling verschoven raken.
Alle log implementaties hebben bij hun log methode ook een extra parameter Throwable waardoor er een keurig stacktrace van die throwable, maar ook zijn causes in de log terecht kan komen. Het lijkt me dan ook dat je beter je log aanroepen of configuratie aan kunt passen dan de schuld op exceptions schuiven.
Natuurlijk, maar als je de code moet aanpassen, hercompileren, uitrollen en de fout reproduceren om te achterhalen waar een exception vandaan kwam, dan had ik liever dat ze het op een andere manier hadden opgelost.
Ja. In principe is dat natuurlijk het hele blackbox concept van OO. [knip uitleg]
Mijn zorg is niet dat het niet kan, maar dat het in de praktijk niet gebeurt. Ik heb geen conceptueel bezwaar tegen Excepties, maar een praktisch bezwaar. En dat is volgens mij ook waar de aversie vandaan komt: het is een taalconstructie die uitnodigt tot misbruik. Ik ben zelf ook een keer in de val getuind te denken 'ach, ik moet hier zoveel waarden op '!= null' controleren... weet je wat, ik wrap het hele zaakje gewoon in een try...catch NullPointerException blok, dan ben ik van dat gecontroleer af. Om vervolgens te ontdekken dat ik later op verschillende nulls wel verschillend wilde reageren, waardoor er logica in het catch blok terechtkwam, etc. Mijn punt is gewoon: als je denkt dat je een exception wil gooien, probeer het dan eerst drie keer op te lossen zonder exception. Als al die ontwerpen minder overzichtelijk zijn dan het geval met de exception, en het gevval met de exception leent zich ook voor latere aanpassing, vooruit, dan zal dit wel een geval zijn waarin het echt het handigst is.
Zou je anders een stukje voorbeeld kunnen geven van wat je daar tegen gekomen bent en waarom je dat een lastige constructie vond?
Ik zal eens kijken of ik dat nog terug kan vinden.