phpbar.de logo

Mailinglisten-Archive

[php] try catch

[php] try catch

Yannik Hampe yannik at cipher-code.de
Mit Apr 16 16:40:11 CEST 2008



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