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