Door
Ozzie PHP
op 16-11-2013 01:35
gewijzigd op 16-11-2013 01:37
4.999 views
Ola peepz,
Nog even een vraagje over eigen exception classes.
Mij werd dus aangeraden om eigen exception classes te gebruiken. Nu zien die classes er allemaal ongeveer zo uit:
<?php
namespace Foo;
use Bar\MyException;
class Exception extends MyException {
public function __construct($message, $code, $previous = null) {
parent::__construct($message, $code, $previous);
}
}
?>
Nu is het zo dat de MyException class een constructor heeft die identiek is aan de constructor van de Foo Exception class. De constructor in de Foo Exception class levert op dit moment dus geen meerwaarde en zou ik dus compleet achterwege kunnen laten. (Hierbij ga ik er nu even vanuit dat ik de $message niet wil aanpassen met een of andere standaardtekst.)
Als ik de constructor zou weglaten, krijg ik als het ware een lege class. Is dat niet vreemd? Of is dit gewoon oké?
Kwestie van stijl. Met bijvoorbeeld een if ($filesystem->createDirectory()) kun je gemakkelijker controlestructuren programmeren. Ontbreekt zo'n direct inzetbare return, dan gebruik ik vaak nog return $this om method chaining te faciliteren.
Een filesystem dat zonder enige controles zomaar directory's maakt, verwijdert en gebruikt, lijkt me voor een framework geen goed idee.
Ook met exceptions is het beter dit in goede banen te leiden:
<?php
try {
if ($this->filesystem->createDirectory($cachedir);) {
$this->filesystem->saveFile($cachefile, $cachedir);
} else {
throw new CacherException('Could not save cache file.');
}
} catch (Exception $e) {
// ...
// Vangt alles: zowel een FilesystemException als de CacherException
// ...
}
?>
Ik zeg niet dat je het zo moet oplossen, hè. De tweede variant kun je uitbreiden.
Ward, dit is wel een interessant punt. Ik dacht juist dat een try/catch een soort vna vervanging was voor een if/else. Ik snap niet wat de meerwaarde is van if/else constructies op het moment dat je toch al voor Exceptions kiest. Jouw laatste voorbeeld, waarom niet zo? Wat is het verschil?
<?php
try {
$this->filesystem->createDirectory($cachedir);
$this->filesystem->saveFile($cachefile, $cachedir);
} catch (FilesystemException $e) {
throw new CacherException('Could not save cache file.');
}
?>
Beide varianten zullen werken, maar het gaat mij vooral om waarom de variant zonder if/else niet goed is? Het komt toch allebei op hetzelfde neer?
Het kan allemaal, daarom gaf ik nu juist twee varianten als voorbeeld :)
Hier is geen duidelijk goed of fout. Er zijn wel twee verschillen:
• De variant met if/else kan nooit een FilesystemException via saveFile() geven als createDirectory() al mislukte. Je hebt dus één exception en kunt duidelijker zien of die door createDirectory() of saveFile() werd veroorzaakt.
• De if/else gooit al een CacherException in de try zodra je weet dat iets mislukt. Jouw variant stelt dat uit en vangt alle FilesystemExceptions in de catch om ze door te gooien als een CacherException.