Ola peepz,

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?
Thanks Wouter :) Gelijk even gebookmarked!

[offtopic]
Wat is dit eigenlijk? Wat doe je hier?

<?php
array_map(function ($i) {
eval("class {$i}Exception extends Exception { }");
}, explode(' ', 'Foo Bar'));
?>
[/offtopic]
>> Wat is dit eigenlijk? Wat doe je hier?

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
?>
Wow :)

Is dat niet lastig om zo even uit je mouw te schudden? :-s
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 { }");
});
?>
Hehe... grappig :) Je blijft me verbazen, hahaha...
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?
Chris - op 12/12/2013 09:24:54

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.
Is alleen niet direct duidelijk voor beginners, vandaar mijn note :)
Chris - op 12/12/2013 09:24:54

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?
Euh guys, het was gewoon een code-trucje van Wouter gebaseerd op het voorbeeldje dat ik eerder had gegeven. Niks aan de hand dus.

Reageren