Mailinglisten-Archive |
Sebastian Mendel wrote:
> Roland Häder schrieb:
>> Dann bist du wieder bei Status-Code und Co. angekommen, was durch die
>> Exceptions ersetzt werden soll.
>
> Wer sagt das?
>
> Exception = Ausnahme/Sonderfall
>
> die sind dafür da wenn wirklich etwas unerwartetes passiert, wenn aus
> irgendeinem Grund irgendetwas fehlschlägt was zur Zeit der Programmierung
> nicht berücksichtigt wurde, und nun trotzdem dem Benutzer in einer
> akzeptablen weiße erklärt werden muss, alles andere sind keine *Ausnahmen*
> und eh durch das Programm zu behandeln.
>
> Bei einer Exception gibt es nämlich eigentlich keine Zustände zum
> Unterscheiden, bzw, kein Zustand mit dem ich etwas anfangen könnte - denn
> dann wäre es keine Exception (Ausnahme).
Nein, das ist nicht ganz richtig. Exceptions mit Ausnahme zu Übersetzen
ist zwar nicht ganz falsch, aber Ausnahme mit Fatal Error gleichzusetzen
ist schon falsch.
Eine Exception heisst prinzipiell erstmal nur, dass etwas nicht so
gelaufen ist, wie geplant.
Um das ganze mal an einer Situation des echten Lebens zu illustrierten
(die Beschreibung habe ich so ähnlich vor einigen Jahren selber mal
gelesen... Fand ich sehr treffend):
Dein Programm soll einem Kunde einen Kaffee servieren. Dazu hast du 3
Exceptions:
TemperatureException extends Exception
TooColdException extends TemperatureException
TooHotException extends TemperatureException
Hier können jetzt alle 3 Fehler auftreten:
$bedienung->serveCoffee($costumer);
Das ist garantiert keine Situation um sich jetzt heulend in die Ecke zu
setzen und das ganze Problem als Designfehler zu deklarieren.
Stattdessen kann man das Problem lösen:
try
{
$bedienung->serveCoffee($costumer);
}
catch(TemperatureException)
{
$bedienung->recollectCoffee();
$bedienung->complainTo($kitchenStaff);
}
oder, wenn das Unternehmen was kleiner ist:
try
{
$bedienung->serveCoffee($costumer);
}
catch(TooColdException)
{
$bedienung->heatUpCoffee();
}
catch(TooHotException)
{
$bedienung->addEiswuerfelToCoffee();
}
ob das mit den Eiswürfeln jetzt 'ne gute Idee ist, sei mal dahin
gestellt, aber es sollte doch klar werden, wie man mit dem Problem
umgehen kann und das Exceptions keinesfalls ein FatalError darstellen.
Frühe hat man das dann so gemacht, dass man einen Errorcode zurückgibt
und dann in irgendwelchen Konstanten irgendwo steht, was das denn
heisst. Das Exceptionsmodell hat jedoch den Vorteil, dass die Exceptions
hoch blubbern, bis sie abgefangen werden. Die Fehlermeldung muss dadurch
nicht zwangsweise direkt mit dem Funktionsaufruf in einem kommen. Das
macht die Sache nicht nur wesentlich übersichtlicher, sondern erzwingt
auch, dass jeder Fehler, der auftritt behandelt wird. Schlimmsten falls
läuft die Exception bis zum Default Exceptionhandler durch, der dann
normalerweise einfach den Stacktrace ausgibt und somit zumindest für den
Programmierer schnell und hilfreich über den Fehler informiert. Bei dem
Errorcodesystem wäre es hier nur zu "unexpected behaviour", gekommen und
das Debugging hätte ohne Anhaltspunkte viel Spaß gemacht.
>
> Exceptions sind nicht dazu um das misslingen einer Funktion, oder etwas
> ungültiges o. ä. zu melden.
Doch, sind sie sehr wohl. Wenn es komplett den Bach runtergeht,
verwendest du keine Exception, sondern gleich exit;
Yannik
php::bar PHP Wiki - Listenarchive