Donnerstag, 28. Juni 2007
Try Catch in PHP4 simulieren
In der Reihe die 100 besten PHP Hacks, Tips und Tricks gibt es einen neuen PHP-Hack. Dieser Hack zeigt euch, wie man in PHP4 einen Try and Catch Mechanismus simulieren kann.
Vorgeschichte
Als ich vor einiger Zeit ein Script welches aus PHP4 Zeiten stammte erweiterte, kam der Wunsch auf Try + Catch, welches normalerweise nur in PHP5 gibt, in PHP4 zu simulieren.
Nachdem ich mir ein paar Gedanken darüber gemacht habe, wurde klar, dass man einen richtigen Try und Catch Mechanismus in PHP4 nicht hinbekommt. So bleibt nur ein relativ einfacher Mechanismus, mit dem sich aber auch behelfen kann.
Der Hack
Der Trick hierbei ist, dass eine Do, While-Schleife dazu verwendet wird, etwas ähnliches wie den Try+Catch zu Mechanismus bauen.
Vorteile
Durch Exceptions kann man die Einrücktiefe des Codes gering halten. Dadurch erhöht sich die Lesbarkeit und somit die Wartbarkeit des Systems. Das ist später bares Geld (Zeit) wert, wenn man auf einen kurzen Blick sieht, was in einem Codeblock passiert. Genau von diesem Vorteil kann man durch diesen PHP-Hack profitieren.
Beispiel
Problematischer Code
Wie oben geschrieben bekommt man oft Codepassagen wie beispielsweise diese zu Gesicht. Die Übersicht geht mit jeder Einrücktiefe immer mehr verloren. Vorallem dann, wenn mal ein paar Zeilen mehr Code zwischen den Anweisungen steht.
- <?php
- $fileName = $_SERVER['PHP_SELF'];
- // tue irgendwas
- // berechne Ergebnis 1
- $result1 = true;
- if($result1) {
- // tue irgendwas
- // berechne Ergebnis 2
- $result2 = false;
- if($result2) {
- // tue irgendwas
- } else {
- // Fehlerbehandlung
- }
- } else {
- // Fehlerbehandlung
- }
- } else {
- // Fehlerbehandlung
- }
- ?>
Simuliertes Try+Catch in PHP 4
Solche Codeteile sind wie geschaffen für einen Try+Catch Block. In PHP4 kann man die Exceptions mit dem unten stehenden Codebeispiel nachahmen.
- <?php
- $fileName = $_SERVER['PHP_SELF'];
- $exception = '';
- do {
- // throw new Exception
- $exception = 'Konnte Datei nicht lesen';
- break;
- }
- // tue irgendwas
- // berechne Ergebnis 1
- $result1 = true;
- if(!$result1) {
- // throw new Exception
- $exception = 'Ergebnis 1 ist falsch';
- break;
- }
- // tue irgendwas
- // berechne Ergebnis 2
- $result2 = false;
- if(!$result2) {
- // throw new Exception
- $exception = 'Ergebnis 2 ist falsch';
- break;
- }
- }while (false);
- // Fehlerbehandlung mit der Variable $exception
- ?>
Erläuterung
Die Do, While-Schleife wird aufjedenfall nur ein einziges mal ausgeführt. Dafür sorgt der False-Parameter, ganz unten in der While-Zeile. Falls es zu einem Fehler kommt, wird der Variable $exception einen String mit einer Fehlermeldung zugewiesen. Die Variable lässt sich dann später zu weiteren Fehlerbehandlung verwenden.
Wenn also ein Fehler aufgetreten ist, wird nach dem setzen der Fehlermeldung der Break-Befehl verwendet, um sofort den Do, While-Block zu verlassen. Danach wird die Variable $exception verarbeitet. Will man etwas genauer arbeiten, bietet sich hier beispielwiese ein Integer als Typ für die Variable $exception an, welchen man später in einem switch/case Kostrukt auswerten kann.
Anonym - #1 - 10.07.2008 16:52 - (Antwort)
was für ein Blödsinn. Ihr PHP Typen, seid doch alle, nur noch Gaga
Mr. Foo - #1.1 - 10.07.2008 17:26 - (Antwort)
Scherzkeks ![]()
[ ] Du weisst, dass PHP4 schon seit über einem halben Jahr Vergangenheit ist?
[ ] Du kennst die Bedeutung der Worte: "kreativ sein"?
Anonym2 - #1.2 - 19.08.2008 15:52 - (Antwort)
jup, ich finde es auch recht blödsinnig.
Ich habe mal gelernt, dass do-while-Schleifen als "unsaubere" Programmierung gelten. Und mittels 'break' eine Schleife zu beenden, ist auch nicht die schönste Art!
Wenn dir der Code zu komplex wird, schreib einfach mehr Kommentare!!! Oft hilft auch eine kurzer Kommentar an der "Klammer-Zu", damit man weiß was jetzt geschlossen wird...
[lang=php]
function bsp()
{
...
1000 Zeilen Code
...
} // Ende function bsp()
[/lang]
Mr. Foo - #1.2.1 - 19.08.2008 22:34 - (Antwort)
Kannst du ja - ändert nichts daran, dass es eine kreative Lösung für ein Problem ist.
Wer sagt, dass das verwenden Do-Loops unsaubere Programmierung ist, hat das Prinzip der fussgeprüften Schleifen nicht verstanden.
Mittels break Schleifen zu beenden hat auch seine Berechtigung. Wie willst du sonnst Schleifen beenden?
Dein Hinweis mit den Kommentaren kann ich gelten lassen - sinvolle Code-Kommentare schaden nie - aber darauf zu schliessen, dass mir Code zu komplex wäre zeigt nicht gerade, dass du mich kennst und vorallem wie ich programmiere.
nikosch - #2 - 26.05.2009 16:05 - (Antwort)
Auch wenn ich die anderen Kommentare für sinnbefreit erachte (Anonym: vermutl. noch nie PHP programmiert, Anonym2: komplett am Thema vorbei) -
Ich selbst benutze gerne Wächter (s.a. http://www.php.de/wiki-php/index.php/Codeoptimierung:W%C3%A4chter), als Exception sind die jedoch nicht zu gebrauchen, weil man eben den fall der uncaught exception nicht abbilden kann, der jedoch wichtig, wenn nicht der wichtigste Vorteil an exceptions ist. Vergisst man im Aufrufstack auch nur an einer Stelle die Fehlerprüfung, fliegt einem die gesamte Chause um die Ohren.
Trotzdem sei ergänzend gesagt, dass in Funktionen/Methoden der Funktionsblock selbst die Schleife ersetzen kann und return statt break benutzt werden.
- - #3 - 10.08.2009 15:39 - (Antwort)
Der große Vorteil von Exceptions ist, dass sie automatisch "weiter geworfen" werden und irgendwo abgefangen werden können oder auch nicht (gemeint sind hierbei verschachtelte Funktions- /Methodenaufrufe). D.h. dein "Workaround" ist absoluter Blödsinn, da es eigentlich nur eine simple Fehlerbehandlung mit Variablen darstellt. Vielleicht solltest du erstmal den Sinn hinter Exceptions verstehen...
Mr. Foo - #3.1 - 25.08.2009 11:39 - (Antwort)
[x] Du hast den Artikel nicht komplett gelesen
[x] Du behauptest Dinge über Leute die du nicht kennst
[x] Du stänkerst einfach gerne rum

Wenn ihr schon immer wissen wolltet, wie ihr mehr aus eurem PHP-Code herausholen könnt, dann ist dieser Artikel genau das Richtige für dich.In dieser Liste werde ich euch die 100 besten PHP Tips, Tricks und Hacks verraten. Ich werde in regelmäßigen Abstän
Aufgenommen: Jun 28, 00:46