Verwijderd schreef op 27 January 2003 @ 21:03:
[...]
Ben ik niet helemaal mee eens... er zijn situaties waarin excepties echt verwacht kunnen worden en dus ook echt zouden *moeten* worden afgevangen ... denk bv aan alles wat met io heeft te maken.. stel dat je van een socket leest.... je hebt geen controle over de server die de data naar je toestuurt... je kan daar als programmeur niet omheen, die socket kan kapot gaan... daar moet je dus wel rekening mee houden...
Dit is een van de breekpunten in de discussie: exception as exceptional state vs. exception as errorreporting tool.
Ik gebruik bv NOOIT exceptions om een zekere verwachte state terug te sturen naar de caller, ALTIJD returnvalues. Alleen wanneer een onverwachte toestand ontstaat (bv je hebt net File.Exists(fileName) gedaan en die gaf aan de file is er, daarna ga je dus lezen en het platform geeft een IOFileNotFound exception, dan propagate die fijn naar boven).
Anderen gebruiken exceptions waar een afwijkende toestand geconstateerd wordt. Mooi voorbeeld is bv een test voordat een actie gedaan wordt, of de huidige user wel de rechten heeft om die actie te doen. Normaliter roep je bv aan:
if(HasRights(Rights.WriteFile))
{
//write the file
}
maar in het geval van Exceptions gebruiken voor errorreporting moet je doen (als je consequent bent!)
try
{
// write file
}
catch (AccessVoilationException ex)
{
// handle this exception here
}
// etc...
Hang je het laatste aan, dan zijn checked exceptions in zekere zin nuttig, hang je het eerste aan, dan zijn CE een nachtmerrie, ivm de vele throw clauses die je moet definieren en stompzinnige retrow catch clauses.
Ik zei met opzet 'als je consequent bent', want je mag geen consessies doen, vind ik, aan een paradigma als je dat verkondigd als "zo moet het", in sommige situaties.
Aan checked exceptions kleven ook de definitie van exception trees in interfaces. Vooral dit aspect vind ik erg kortzichtig, want een exception die aan een method signature hangt, is daar geplaatst ivm de implementatie (de body) van de method. Wijzigt die methodbody (maar dus niet de functionaliteit noch de header) dan wijzigt dus ook de signature, en daarmee de interface. Dit resulteert in exception swallowing/encapsulation, wat het hele idee van checked exceptions omzeep helpt.
Maar nogmaals, lees die thread in de C# newsgroup maar door, want alles (behalve de generics relatie) is al gezegd.
Over de generics relatie: Alarmnummer: je zegt nu wel dat je mbv de template de exception ook afhankelijk kunt maken van je inputtypes van je template, maar dat impliceert ook dat je je exception hierarchie templatificeert. Wat inhoudt dat je catch clauses dus complexer worden, want je moet voor ieder type een aparte clause opnemen. (of ook templatificeren). Lijkt me een highroad naar onleesbare code met een veel te hoge complexiteitsfactor (lees: schiet zn doel ver en ver voorbij, nl. KISS)