Ik zit de laatste dagen wat te stoeien met exceptions, en ik vraag me nu af hoe jullie exceptions gebruiken. Gebruik je exceptions vooral om onverwachte gebeurtenissen op te vangen, of gebruik je ze ook als vervanging van if/else? Met dat laatste bedoel ik dit:
Zelf zou ik normaal gesproken dit doen:
<?php
if ($this->foo() === true) {
$this->bar();
} else {
$this->foobar();
}
?>
Nu zeggen een aantal van jullie dat het goed is om exceptions in je flow op te nemen. Is het dan de bedoeling dat je dit gaat doen?
<?php
try {
$this->foo();
$this->bar();
} catch (FooException $e) {
$this->foobar();
}
?>
Wat is nu in essentie het doel van Exceptions? Onverwachte dingen afhandelen (een database die gene verbinding kan maken, een bestand dat niet kan worden weggeschreven, een mailserver die plat ligt) of is het een moderne variant van if/else?
Snelle en hele lelijke methode om de 2 exception klassen aan te maken:
<?php
explode(' ', 'Foo Bar'); // is eigenlijk gewoon array('Foo', 'Bar');
array_map(function ($i) { ... }, $array); // is eigenlijk gewoon foreach ($array as $i) { ... }
eval("class {$i}Exception extends Exception {}");
// eval voert de string als PHP uit (hartstikke gevaarlijk)
// en $i is Foo en Bar, om zo FooException en BarException te maken die \Exception extenden
?>
Nee, anders had ik die code zelf wel 2 keer opgeschreven. :p (was ik waarschijnlijk qua typewerk sneller klaar geweest)
En eigenlijk denk ik, nu ik er wat langer over nadenk, dat dit zelfs mooier en sneller was geweest:
<?php
spl_autoload_register(function ($c) {
eval("class {$c} extends Exception { }");
});
?>
Houd er overigens rekening mee dat [php]eval[/php] vaak wordt uitgeschakeld in de PHP.ini omdat het wordt beschouwd als een onveilige functie.
Buiten dat, waarom een spl_autoload_register die een Exception extend en niet eerst zoeken of de class in een ander bestand staat? Lijkt mij dat dáár de autoload juist voor is toch?
Houd er overigens rekening mee dat [php]eval[/php] vaak wordt uitgeschakeld in de PHP.ini omdat het wordt beschouwd als een onveilige functie.
Buiten dat, waarom een spl_autoload_register die een Exception extend en niet eerst zoeken of de class in een ander bestand staat? Lijkt mij dat dáár de autoload juist voor is toch?
Het is puur opzichzelf staand voorbeeld code om een punt te maken. Het is een truckje dat je eigenlijk alleen tijdens testen of voorbeeldjes wilt gebruiken.
Buiten dat, waarom een spl_autoload_register die een Exception extend en niet eerst zoeken of de class in een ander bestand staat? Lijkt mij dat dáár de autoload juist voor is toch?
En daarbij: als je toch via spl_autoload_register() aan de slag gaat met SPL, waarom dan niet ook de SPL exceptions gebruiken?