Hi,
eigentlich funktioniert die Fehlerbehandlung mit Perl recht gut - ausgenommen in diesem Fall, da komme ich einfach nicht weiter... Vielleicht bin ich auch einfach nur blind, oder so... Ich poste einfach mal ein Beispielscript, dass so im Großen und Ganzen darstellt, was passiert:
<CUT>
#!/usr/bin/perl
use DBI;
&mysql_connect();
AUFWACHEN:
if(!&mysql_check()){
&mysql_connect();
}
$cmd=$mysql->prepare("SHOW DATABASES");
$cmd->execute();
$cmd->finish();
sleep(10);
goto AUFWACHEN;
sub mysql_connect(){
my $mysql_connect_counter=0;
while(!&mysql_check()&&$mysql_connect_counter<10){
$mysql_connect_counter++;
if($mysql_connect_counter>1){
sleep(3);
}
$mysql=DBI->connect("DBI::mysqlPP:datenbank:localhost","user","pwd",{PrintError=>0,AutoCommit=>1});
}
if(!&mysql_check()){
die "Keine MySQL-Verbindung möglich: $DBI::errstr\t$!";
}
}
sub mysql_check(){
return $mysql->ping;
}
END{
$mysql->disconnect();
exit;
}
</CUT>
Knackpunkt ist hier die Funktion "mysql_check()":
Mal angenommen während "sleep(10);" wird die MySQL-Verbindung abgebaut - dann soll beim nächsten Lauf "mysql_check()" true oder false zurückgeben und bei false die Funktion "mysql_connect()" aufgerufen werden. Innerhalb von "mysql_connect()" wird zehn mal versucht die MySQL-Verbindung wieder herzustellen - klappt das nicht, wird das Script beendet.
Das Problem ist aber: Wird die MySQL Verbindung tatsächlich getrennt und "mysql_check()" aufgerufen, gibt es folgenden Fehler und das Script wird gekillt, ohne dass ich die Möglichkeit hätte mit dem Rückgabewert von "mysql_check()" was anzufangen:
Can't call method "ping" on an undefined value at test.pl line ....
Versucht habe ich das auch so:
<CUT>
Funktioniert leider nicht mit mysqlPP
sub mysql_check(){
return $mysql->{Active};
}
</CUT>
Oder so:
<CUT>
Bricht genau so gnadenlos ab wie ping (Can't call method "prepare" on an undefined value at test.pl line ....)
sub mysql_check(){
$cmd=$mysql->prepare("SHOW DATABASES")||return -1;
$cmd->finish();
return 1;
}
</CUT>
Das Problem ist hier, dass eben die Methode "ping" oder "prepare" zu dem Zeitpunkt, zu dem die Verbindung abgebaut wurde, nicht mehr in $mysql existiert - gibt es vielleicht eine Möglichkeit auf das Vorhandensein einer Methode zu prüfen??
Ciao
nd