Donnerstag, 28. Juni 2007

PHP

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.

Download Code!

  1.  
  2. <?php
  3.  
  4.  
  5. $fileName = $_SERVER['PHP_SELF'];
  6.  
  7.  
  8. if(file_exists($fileName)) {
  9.         // tue irgendwas
  10.         // berechne Ergebnis 1
  11.         $result1 = true;
  12.         if($result1) {
  13.                 // tue irgendwas
  14.                 // berechne Ergebnis 2
  15.                 $result2 = false;
  16.                 if($result2) {
  17.                         // tue irgendwas
  18.                 } else {
  19.                         // Fehlerbehandlung            
  20.                 }
  21.         } else {
  22.                 // Fehlerbehandlung
  23.         }
  24. } else {
  25.         // Fehlerbehandlung
  26. }
  27. ?>
  28.  

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.

Download Code!

  1.  
  2. <?php
  3. $fileName = $_SERVER['PHP_SELF'];
  4. $exception = '';
  5. do {
  6.         if(!file_exists($fileName)) {
  7.                 // throw new Exception
  8.                 $exception = 'Konnte Datei nicht lesen';
  9.                 break;
  10.         }
  11.         // tue irgendwas
  12.         // berechne Ergebnis 1
  13.         $result1 = true;
  14.         if(!$result1) {
  15.                 // throw new Exception
  16.                 $exception = 'Ergebnis 1 ist falsch';
  17.                 break;
  18.         }
  19.         // tue irgendwas
  20.         // berechne Ergebnis 2
  21.         $result2 = false;
  22.         if(!$result2) {
  23.                 // throw new Exception
  24.                 $exception = 'Ergebnis 2 ist falsch';
  25.                 break;
  26.         }
  27. }while (false);
  28.  
  29. // Fehlerbehandlung mit der Variable $exception
  30. echo $exception;
  31. ?>
  32.  

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.

Bewertung: 2 von 5, 1 Stimme(n) 1852 Klicks
PHP
Von Mr.Foo in PHP am 28.06.07@00:32 Uhr

Trackbacks
Trackback für spezifische URI dieses Eintrags

100 besten PHP Hacks, Tips und Tricks
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
Weblog: Entwickler Blog
Aufgenommen: Jun 28, 00:46

7 Kommentare
Ansicht der Kommentare: (Linear | Verschachtelt)

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


Kommentar schreiben

Umschließende Sterne heben ein Wort hervor (*wort*), per _wort_ kann ein Wort unterstrichen werden.
Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.
Die angegebene E-Mail-Adresse wird nicht dargestellt, sondern nur für eventuelle Benachrichtigungen verwendet.
Sie können [geshi lang=LANG][/lang] Tags verwenden um Quellcode abhängig von der gewählten Programmiersprache einzubinden
 
 

Mr. Foo

Try Catch in PHP4 simulieren

  • Homepage

Suche

Kategorien

  • Android (2)
  • C-Sharp (4)
  • Datenbank (30)
  • Delphi (2)
  • Entwicklung (36)
  • Flash (5)
  • Games (10)
  • Gutscheine (4)
  • Hardware (14)
  • HTML CSS (16)
  • Internet (88)
  • Java (32)
  • Javascript (24)
  • Linkdump (9)
  • Linux (102)
  • Low-Level (10)
  • Lua (8)
  • Musik (9)
  • Netzwerk (25)
  • New World Order (109)
  • Perl (3)
  • PHP (130)
  • Magento (5)
  • Symfony (3)
  • Zend Framework (7)
  • Probleme und Lösungen (26)
  • Python (22)
  • Ressourcen (23)
  • Sicherheit (91)
  • Software (60)
  • Sonstiges (47)
  • Own Stuff (48)
  • Spass (46)
  • Technik / Wissenschaft (4)
  • Tips (15)
  • Weisheiten (17)
  • Windows (23)
  • Wort des Tages (15)


Alle Kategorien

Archive

  • Mai 2012
  • April 2012
  • März 2012
  • Das Neueste ...
  • Älteres ...

Abonnieren lohnt sich!

  • XML RSS 2.0 feed
  • ATOM/XML ATOM 1.0 feed
  • XML RSS 2.0 Kommentare

Tagcloud

Datenbank Entwicklung Internet Java Javascript Linux Lösung Netzwerk News New World Order PHP Problem Probleme und Lösungen Sicherheit Software Sonstiges Spass Tipp Update Windows

Beliebte Einträge

  • Magento ist scheisse (197)
  • Plugin-container.exe deaktivieren (107)
  • BWin Betrug und Abzocke bei Minigames? (65)
  • C compiler cannot create executables unter Debian (53)
  • Scheiss Linux - USB-Platte viel zu langsam (wenns mal funktioniert) (43)
  • Sicheres Kontaktformular mit PHP - Spam verhindern (37)
  • UML-Diagramme aus Java-Klassen generieren – Java2UML (28)
  • Es konnte keine TCP/IP-Verbindung mit dem Host hergestellt werden (28)
  • Option Bug im Internet Explorer bei Nutzung von innerHTML und Javascript (24)
  • Zend Studio - Javaw.exe lastet die CPU aus (24)

Kommentare

Hugo zu BWin Betrug und Abzocke bei Minigames?
So, 20.05.2012 12:25
ich habe mich gestern auf BWIN reg [...]
Ubuntu 12.04 zu The assembly mscorlib.dll was not found or could not be loaded.
Fr, 18.05.2012 17:11
Hat bei mir leider nicht geklappt. [...]
Oliver Riske zu Es konnte keine TCP/IP-Verbindung mit dem Host hergestellt werden
Di, 15.05.2012 20:38
Super Danke!
anon zu BWin Betrug und Abzocke bei Minigames?
Sa, 05.05.2012 18:43
ihr scheiss betrüger
Jürgen zu Unable to elevate error:1814 VLC Problem
Mi, 02.05.2012 16:54
So einfach ist es bei mir jedenfal [...]
 

Kontakt/Informationen