base
portal
Suche:
Forum
Start
Neue Seite erstellen
Titel:
Mit baseportal ist alles möglich und der Schlüssel dazu ist die eigene Programmierung. Allerdings ist dies nicht immer einfach: Selten läuft ein Programm auf Anhieb. Seien Sie deshalb nicht frustriert, denn das ist völlig normal und wird Ihnen auch nach Jahren Programmier-Praxis noch ständig passieren ;-) Man sagt 50% der Programmierzeit wird zur Fehlersuche benötigt, aber das ist untertrieben. Nur, wie geht man vor, wenn das Programm nicht das tut, was es soll? Zuerst gilt es verschiedene Fehlertypen zu unterscheiden: <h2>Syntax Fehler</h2> Das Beste was Ihnen passieren kann: Das Programm wird erst garnicht ausgeführt und der Computer gibt nur eine Fehlermeldung aus. <ul><li>Lesen Sie diese Fehlermeldung genau und versuchen Sie diese zu verstehen. Meistens steht eine Zeilennummer dabei, die Sie natürlich genau untersuchen sollten. Prüfen Sie aber auch die direkt davorstehenden Zeilen, denn manchmal tritt ein Fehler erst einige Zeilen hinter der eigentlichen Ursache auf. <li>Wenn Sie nicht sicher sind, welche Zeile den Fehler auslöst, deaktivieren Sie verdächtige Zeilen, indem Sie ein Kommentarzeichen <c>#</c> dacor machen und schauen Sie, ob der Fehler noch da ist. Tritt der Fehler in einer sehr langen Zeile auf, versuchen Sie, die Zeile zu unterteilen, so dass Sie den Teil herausfinden, der für den Fehler verantwortlich ist. <li>Überprüfen Sie insbesondere, ob Sie alle Klammern <c>(..) [..]</c> oder <c>{..}</c> und Anführungszeichen <c>".."</c> oder <c>'..'</c> geschlossen haben. </ul> <h2>Unvollständige/falsche Ausgabe, unerwünschtes Verhalten</h2> <ul><li>Setzen Sie an passenden Stellen im Programm Testausgaben: Werden diese überhaupt ausgeführt und ausgegeben? <li>Wichtig sind Variablen: Lassen Sie sich an verschiedenen Stellen deren Inhalte ausgeben. Haben diese die Werte die sie haben sollten? <li>Prüfen Sie durch Testausgaben, ob Bedingungen erfüllt sind oder nicht und wie oft Schleifen tatsächlich durchlaufen werden.</ul> Verwenden Sie zur Überprüfung der Variablen den Befehl [564#3:dump]. <h2>Nicht reproduzierbare Fehler</h2> Das Schlimmste was passieren kann, sind Fehler die manchmal auftreten und manchmal nicht. <ul><li>Versuchen Sie auf jeden Fall den Fehler zu reproduzieren, indem Sie genau die Schritte nachvollziehen, die dazu führten. Gelingt dies nicht hilft hier nur die genaue Analyse des Programms weiter. Versuchen Sie dabei einen "anderen Blickwinkel" einzunehmen, als Sie bisher hatten.</ul> <h2>Beispiele</h2> <code> $pos=index($text, "&kennung=); </code> Diese Zeile ist fehlerhaft und führt zu folgender Fehlermeldung: <code> [ Fehler: Fehlerhafter Perl Code in : Can't find string terminator '"' anywhere before EOF at (eval 4224) line 2. ] </code> Das bedeutet, dass in dieser Zeile ein (doppeltes) Anführungszeichen <c>"</c> zuviel oder zuwenig ist. Wenn wir die Zeile darauhin genau untersuchen, stellen wir fest, dass nach dem <c>"&kennung=</c> das schliessende <c>"</c> fehlt. Richtig ist also: <code> $pos=index($text, "&kennung="); </code> Jetzt etwas komplizierter: <code> my $back=""; $back=substr($text, 0, $pos); $back=substr($text2, rindex($text2, &end=')); ($back)=$back=~ /&kennung=(.*?)">/; $back='<a href="$link">'.$back.'</a>"; </code> Diese führt zu folgender Fehlermeldung: <code> [ Fehler: Fehlerhafter Perl Code in : Search pattern not terminated at (eval 6764) line 2. ] </code> Das hilft uns erstmal nicht weiter, im Gegenteil, die Fehlermeldung führt uns auf eine falsche Fährte, denn wir könnten vermuten, dass in der <i>regular expression</i> der Fehler steckt. Durch Aufteilen der Zeile in die einzelnen Befehle und Auskommentieren können wir dies überprüfen: <code> #my $back=""; #$back=substr($text, 0, $pos); #$back=substr($text2, rindex($text2, &end=')); ($back)=$back=~ /&kennung=(.*?)">/; #$back='<a href="$link">'.$back.'</a>"; </code> Rufen wir diesen Code auf, gibt es keine Fehlermeldung - die Zeile scheint also in Ordnung zu sein. Probieren wir eine andere Zeile: <code> #my $back=""; #$back=substr($text, 0, $pos); #$back=substr($text2, rindex($text2, &end=')); #($back)=$back=~ /&kennung=(.*?)">/; $back='<a href="$link">'.$back.'</a>"; </code> Hier bekommen wir die Meldung: <code> [ Fehler: Fehlerhafter Perl Code in : Can't find string terminator "'" anywhere before EOF at (eval 618) line 6. ] </code> Diese Zeile ist also fehlerhaft und der Fehler ist etwas schwer zu finden, denn es sieht auf den ersten Blick nicht so aus, als ob ein <c>'</c> fehlen würde. Tatsächlich haben wir fälschlicherweise am Ende doppelte Anführungszeichen <c>"</c> statt dem einfachen verwendet. Richtig muss es so aussehen: <code> $back='<a href="$link">'.$back.'</a>'; </code> Entfernen wir nun vor den anderen Zeilen die Kommentarzeichen erleben wir eine böse Überraschung: <code> [ Fehler: Fehlerhafter Perl Code in : Search pattern not terminated at (eval 5696) line 6. ] </code> Da wir in der letzten Zeile eindeutig einen Fehler gefunden haben, muss sich also noch irgendwo ein anderer Fehler befinden. Durch Auskommentieren können wir wieder feststellen, wo genau: <code> my $back=""; $back=substr($text, 0, $pos); #$back=substr($text2, rindex($text2, &end=')); ($back)=$back=~ /&kennung=(.*?)">/; $back='<a href="$link">'.$back.'</a>'; </code> Ist die dritte Zeile auskommentiert kommt keine Fehlermeldung - hier dürfte sich der Fehler verstecken. Und tatsächlich ist hier ein Anführungszeichen <c>'</c> vor dem <c>&end='</c> zuwenig. So funktioniert es: <code> $back=substr($text2, rindex($text2, '&end=')); </code> Nun bekommen wir keine Fehlermeldung mehr beim Aufruf - allerdings ist immer noch ein Fehler versteckt. Das Programm läuft zwar, aber es tut nicht was wir wollen. Natürlich hängt dies davon ab, was dieser Codeteil überhaupt machen soll, aber auch ohne jetzt genau auf die Funktionsweise des Codeteils einzugehen, kann man mit einer gewissen Erfahrung sehen, dass etwas nicht stimmt. Es sollen aus zwei Texten bestimmte Teile herausgeschnitten und daraus wiederum eine Kennung für einen Link geholt werden. Wie kommt man dahinter was dabei nicht funktionieren würde? Indem man sich die Variablenwerte ausgeben lässt: <code> my $back=""; $back=substr($text, 0, $pos); out "back=$back, text=$text, pos=$pos<br>"; $back=substr($text2, rindex($text2, '&end=')); out "back=$back, text2=$text2<br>"; ($back)=$back=~ /&kennung=(.*?)">/; out "back=$back<br>"; $back='<a href="$link">'.$back.'</a>'; out "back=$back<br>"; </code> Beim Aufruf dieses Codes würde man schnell feststellen, dass <c>$back</c> nach der zweiten Zuweisung seinen ersten Wert verloren hat, was so nicht gewünscht ist. Gewollt war sicherlich ein Hintanfügen: <code> $back.=substr($text2, rindex($text2, '&end=')); </code>
Name:
Passwort:
Stichworte:
Version:
1
2
3 Angebot:
Alle
Nur Miete / Lizenz
Nur Miete / Lizenz professional
Nur Miete
Nur Miete smart + pro
Nur Miete smart + pro / Lizenz
Nur Miete pro
Nur Miete ab pure2, smart2, pro1
Nur Lizenz
Nur Lizenz professional
Nur Kostenlos
Ohne Änderungen zurück zur Seite
-
+
©
baseportal
GmbH. Alle Rechte vorbehalten.
powered in 0.01s by baseportal.de
Erstellen Sie Ihre eigene Web-Datenbank - kostenlos!