baseportal
Suche: 
 Forum   Start 

Fehlersuche

 
Verstecken Inhalt
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:


Syntax Fehler

Das Beste was Ihnen passieren kann: Das Programm wird erst garnicht ausgeführt und der Computer gibt nur eine Fehlermeldung aus.


Unvollständige/falsche Ausgabe, unerwünschtes Verhalten

Verwenden Sie zur Überprüfung der Variablen den Befehl dump.


Nicht reproduzierbare Fehler


Das Schlimmste was passieren kann, sind Fehler die manchmal auftreten und manchmal nicht.


Beispiele

$pos=index($text, "&kennung=);

Diese Zeile ist fehlerhaft und führt zu folgender Fehlermeldung:

[ Fehler: Fehlerhafter Perl Code in :
Can't find string terminator '"' anywhere before EOF at (eval 4224) line 2. ]

Das bedeutet, dass in dieser Zeile ein (doppeltes) Anführungszeichen " zuviel oder zuwenig ist. Wenn wir die Zeile darauhin genau untersuchen, stellen wir fest, dass nach dem "&kennung= das schliessende " fehlt. Richtig ist also:

$pos=index($text, "&kennung=");

Jetzt etwas komplizierter:

my $back=""; $back=substr($text, 0, $pos); $back=substr($text2, rindex($text2, &end=')); ($back)=$back=~ /&kennung=(.*?)">/; $back='<a href="$link">'.$back.'</a>";

Diese führt zu folgender Fehlermeldung:

[ Fehler: Fehlerhafter Perl Code in :
Search pattern not terminated at (eval 6764) line 2. ]

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 regular expression der Fehler steckt. Durch Aufteilen der Zeile in die einzelnen Befehle und Auskommentieren können wir dies überprüfen:

#my $back="";
#$back=substr($text, 0, $pos);
#$back=substr($text2, rindex($text2, &end='));
($back)=$back=~ /&kennung=(.*?)">/;
#$back='<a href="$link">'.$back.'</a>";

Rufen wir diesen Code auf, gibt es keine Fehlermeldung - die Zeile scheint also in Ordnung zu sein. Probieren wir eine andere Zeile:

#my $back="";
#$back=substr($text, 0, $pos);
#$back=substr($text2, rindex($text2, &end='));
#($back)=$back=~ /&kennung=(.*?)">/;
$back='<a href="$link">'.$back.'</a>";

Hier bekommen wir die Meldung:

[ Fehler: Fehlerhafter Perl Code in :
Can't find string terminator "'" anywhere before EOF at (eval 618) line 6. ]

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 ' fehlen würde. Tatsächlich haben wir fälschlicherweise am Ende doppelte Anführungszeichen " statt dem einfachen verwendet. Richtig muss es so aussehen:

$back='<a href="$link">'.$back.'</a>';

Entfernen wir nun vor den anderen Zeilen die Kommentarzeichen erleben wir eine böse Überraschung:

[ Fehler: Fehlerhafter Perl Code in :
Search pattern not terminated at (eval 5696) line 6. ]

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:

my $back="";
$back=substr($text, 0, $pos);
#$back=substr($text2, rindex($text2, &end='));
($back)=$back=~ /&kennung=(.*?)">/;
$back='<a href="$link">'.$back.'</a>';

Ist die dritte Zeile auskommentiert kommt keine Fehlermeldung - hier dürfte sich der Fehler verstecken. Und tatsächlich ist hier ein Anführungszeichen ' vor dem &end=' zuwenig. So funktioniert es:

$back=substr($text2, rindex($text2, '&end='));

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:

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>";

Beim Aufruf dieses Codes würde man schnell feststellen, dass $back nach der zweiten Zuweisung seinen ersten Wert verloren hat, was so nicht gewünscht ist. Gewollt war sicherlich ein Hintanfügen:

$back.=substr($text2, rindex($text2, '&end='));

Letzte Änderung am 4.4.2007, 17:36 - Stichworte: Fehlersuche, Debugging, Syntax Error, Auskommentieren

c - o - + 
© baseportal GmbH. Alle Rechte vorbehalten.


powered in 0.01s by baseportal.de
Erstellen Sie Ihre eigene Web-Datenbank - kostenlos!