Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]3413[/thread]

Zusätzliches bei SQL-Fehler ausgeben: Problem...



<< >> 10 Einträge, 1 Seite
pktm
 2004-02-27 21:58
#31785 #31785
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!

Ich würde mir gerne bei einem SQL-Statement in einer Sub ausgeben lassen, aus welcher Zeile diese

aufgerufen wurde (bei einem Fehler).
Dazu habe ich den optionalen Parameter $line, aber der wird hier irgendwie nicht mit ausgegeben:
Code: (dl )
my $rv = $sth->execute        || die "Zeile: $line" . $dbh->errstr;

Wie kann ich das denn erreichen?

mfg pktm
http://www.intergastro-service.de (mein erstes CMS :) )
esskar
 2004-02-27 22:39
#31786 #31786
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
versuch es mal mit $!
renee
 2004-02-27 22:42
#31787 #31787
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wo kommt das $line her??

Wie meinst Du das "aus welcher Zeile es aufgerufen wird"??

Hast Du das $sth->execute() in einer Sub??
Wenn ja, dann übergeb der Sub doch beim Aufruf, welche Zeile das ist...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Strat
 2004-02-27 23:21
#31788 #31788
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
gab es da nicht ?

Code: (dl )
my $rv = $sth->execute  or die("Zeile: ", , $dbh->errstr, "\n");
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
coax
 2004-02-27 23:21
#31789 #31789
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
Hi die Zeile in der die Subroutine aufgerufen wurde bekommst du ueber caller im Listenkontext.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl

foo();

foo();

sub foo {

     my($package, $filename, $line) = caller();
     
     print "Aufgerufen in: $line\n";

}


edit: das LINE Token erzeugt 'n Parsefehler\n\n

<!--EDIT|coax|1077917533-->
,,Das perlt aber heute wieder...'' -- Dittsche
Strat
 2004-02-27 23:22
#31790 #31790
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
wenn du den fehleroutput von einer subroutine erledigen lassen willst, finde ich zum debuggen das Rezept Backtracking auf meiner HP unter Perl -> Tips&Tricks -> Perl-Enhanced recht nuetzlich
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
pktm
 2004-02-27 23:24
#31791 #31791
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Oh, sry, etwas wenig Info:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
sub get_cmd {
# returns an array of sth->fetchrow_hashref
my $cmd = shift;
my $line = shift || 'keine Angabe';
my $data = [];
my $sth = $dbh->prepare($cmd) || die "Zeile: $line" . $dbh->errstr;
my $rv = $sth->execute || die "Zeile: $line" . $dbh->errstr;
while( my $ref = $sth->fetchrow_hashref() ){
push @{ $data }, $ref;
}
$sth->finish();
return $data;
} # get_cmd
http://www.intergastro-service.de (mein erstes CMS :) )
Strat
 2004-02-27 23:53
#31792 #31792
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
und verwendet $dbh als globale variable ....tststs... so eine verdeckte parameteruebergabe finde ich nicht schoen...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
pktm
 2004-02-28 11:17
#31793 #31793
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Gut, jetzt bekomme ich $line schonmal ohne übergabe von _ _LINE_ _, da kann ich dan $dbh übergeben :)
Aber beim Aufruf die "Zeile: $line" . $dbh->errstr; erhalte ich trotzdem nur die SQL-Fehlermeldung und nicht "Zeile: $line" davor.
Wie muss ich das denn schreiben?
mfg pktm
http://www.intergastro-service.de (mein erstes CMS :) )
Strat
 2004-02-28 12:30
#31794 #31794
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
also wenn $dbh->errstr() ausgegeben wird, muss auch "Zeile: $line " ausgegeben werden. Kann es sein, dass da an einer anderen Stelle ein Fehler auftritt, wo kein die "Zeile: $line " . $dbh->errstr() steht?

Nebenbei: das || wird folgendermaszen ausgewertet:
Code: (dl )
my $sth = ( $dbh->prepare($cmd) || die "Zeile: $line" . $dbh->errstr );

Beim die bleibt es sich egal, aber wenn du da sonst was machen willst, wird da bei einem Fehler der rechte Teil des ||-Ausdruckes an $sth ueberwiesen. Wenn du da anstelle von die print schreibst, bekommst du einen schoenen Fehler... Mit or anstelle von || umgehst du dieses potentielle Problem.

ich verwende or die so gut wie nie, sondern lieber eine syntax wie die folgende:
Code: (dl )
1
2
3
4
5
6
7
my $sth = $dbh->prepare($cmd);
unless ($sth) {
die "Zeile: $line" . $dbh->errstr();
}
else {
# ...
}

weil ich dann einfach das die durch eine vernuenftige Fehlerausgabe ersetzen kann (z.B. &WriteHtmlError($r, $dbh, $errorMessage) oder so), was gerade bei CGI- und mod_perl-Scripten sehr wichtig sein kann, weil da ein 500er-Fehler selten einen guten Eindruck hinterlaesst.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 10 Einträge, 1 Seite



View all threads created 2004-02-27 21:58.