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

Abbruch bei mißglücktem dbi->connect



<< >> 9 Einträge, 1 Seite
Gast Gast
 2005-08-04 13:55
#44277 #44277
Hallo zusammen!

Hab hier ein kleines Problem. Bin mir nur nicht ganz sicher, ob es das richtige Forum ist...

Ich hab eine kleine Anwendung geschrieben mit Tk und will im Script irgendwann mal einen Datenbank-connect machen. Der Datenbankserver zu dem ich hier connecten will existiert nicht. Allerdings sollte er mir dann ne Fehlermeldung ausgeben oder wenigstens abstürzen! :)

Code: (dl )
1
2
3
4
5
6
7
8
9
my $dbh = DBI->connect(SQLCONNECT,SQLUSER,SQLPASS); $dbh->{RaiseError} = 0;

if (! $dbh)
{
$gui->destroy();
fehlgeschlagen();
system("echo \"deine mudder\" >> /dev/pts/2");
exit(1);
}


Egal wie ich es mache, ob ich RaiseError auf 0 oder 1 setze, ob ich hinter DBI->connect noch ein "or die" schreibe oder nicht, die Gui bleibt einfach stehen und wartet und wartet und wartet...

Auf der Konsole gibt er mir aber die Fehlermeldung aus, dass er nicht connecten konnte

Code: (dl )
DBI connect('XXXXX','XXXXX',...) failed: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) at /usr/bin/usb_send.pl line 144


Ich hoffe die Informationen reichen euch und mir kann jemand helfen, bin schon am verzweifeln...

MfG
n0bbi
Strat
 2005-08-04 14:23
#44278 #44278
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
das ist ein Feature von Tk...
also besser selbst den fehler abfangen und anstelle von exit Tk::exit verwenden... teste mal:
Code: (dl )
1
2
3
4
5
my $dbh = DBI->connect($dsn, $user, $pass, {RaiseError => 0} );
unless ($dbh) {
 print LOG "Fehler beim connect: $DBI::errstr\n"; # oder was auch immer
 Tk::exit(1);
} # unless
\n\n

<!--EDIT|Strat|1123151030-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Gast Gast
 2005-08-04 15:26
#44279 #44279
Vielen Dank Strat!

Aber ich hab glaube ich da noch ein ganz anderes Problem:

Auf der Konsole wird mir immer dieser Fehler ausgegeben, allerdings geht er anscheinend nur in die Schleife rein, wenn ich

Code: (dl )
unless(!$dbh)


als Bedingung schreibe und nicht

Code: (dl )
unless($dbh)


Kann du dir das erklären!? :)

MfG
n0bbi
Strat
 2005-08-04 16:07
#44280 #44280
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das verstehe ich nicht. was meinst du mit schleife?
Code: (dl )
1
2
3
unless(! $dbh)
#entspricht
if ($dbh)

d.h. der connect war erfolgreich.
bei
Code: (dl )
1
2
3
unless ($dbh) {
# entspricht
if (! $dbh) {

betritt er den block nur, wenn der connect fehlschlug.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
ptk
 2005-08-04 16:29
#44281 #44281
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Du setzt RaiseError zu spaet. Das muss schon innerhalb von connect passieren. Ansonsten kannst du ein eval drumherumpacken.
Gast Gast
 2005-08-04 16:29
#44282 #44282
So geht er rein:
Code: (dl )
1
2
3
4
5
 unless (!$dbh)
{
system("echo \"Fehlgeschlagen!\" >> /dev/pts/2");
Tk::exit(1);
} # unless


Das bekomme ich dann auf der Konsole zu sehen:

Code: (dl )
1
2
3
DBI connect('xxx','xxx',...) failed: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) at /usr/bin/usb_send.pl line 144
Callback called exit, <SGINFO> line 2.
Callback called exit, <SGINFO> line 2.


Und so geht er nicht rein:
Code: (dl )
1
2
3
4
5
 unless ($dbh)
{
system("echo \"Fehlgeschlagen!\" >> /dev/pts/2");
Tk::exit(1);
} # unless


wobei ich dann folgendes auf der Konsole sehe:

Code: (dl )
1
2
3
4
5
DBI connect('xxx','xxx',...) failed: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) at /usr/bin/usb_send.pl line 144
Tk::Error: Tk::Button=HASH(0x82f1e58) is not a Tk object at /usr/lib/perl5/Tk.pm line 91, <SGINFO> line 2.
*Tk::Toplevel::_Destroyed
Tk callback for .button
(command bound to event)


Wobei er im letzteren Fall auch nicht die Gui beendet!
Gast Gast
 2005-08-04 16:43
#44283 #44283
[quote=ptk,04.08.2005, 14:29]Du setzt RaiseError zu spaet. Das muss schon innerhalb von connect passieren. Ansonsten kannst du ein eval drumherumpacken.[/quote]
Meintest du so?

Code: (dl )
my $dbh = DBI->connect(SQLCONNECT,SQLUSER,SQLPASS,RaiseError => 1);


oder so?

Code: (dl )
my $dbh = DBI->connect(SQLCONNECT,SQLUSER,SQLPASS,{RaiseError => 1});


Weil in beiden Fällen geht er nämlich gar nicht mehr in die Schleife rein, egal was ich mache...

Wie würde ich das denn mit eval lösen müssen?
ptk
 2005-08-04 16:56
#44284 #44284
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Du willst doch RaiseError => 0???
Gast Gast
 2005-08-04 17:01
#44285 #44285
Du GOTT!!! :)

Ich weiss doch selber net was ich will. Eigentlich will ich nur, dass es funktioniert und dank euch tuts das jetzt auch!

Vielen Dank nochmal!

Gruß
n0bbi
<< >> 9 Einträge, 1 Seite



View all threads created 2005-08-04 13:55.