Comment puis-je éviter une erreur dans mon script Perl de terminer le script?
-
16-09-2019 - |
Question
J'ai un simple script Perl qui fonctionne comme un démon Linux en utilisant une boucle infinie. Il se connecte à une base de données toutes les 10 secondes pour exécuter un processus.
while (1)
{
# THIS LINE WILL KILL THE SCRIPT IF IT FAILS
my $DB=DBI->connect("dbi:Sybase:server=myserver","user","password");
. . . do something . . .
sleep (10);
}
J'ai deux questions:
- Si le DB est indisponible, comment je peux garder le script en cours d'exécution?
- Puis-je ajouter un gestionnaire d'exception pour me envoyer un e-mail ou enregistrer une erreur?
La solution
tente de se connecter à des intervalles de 10 secondes, et non pas toutes les 10 secondes, comme William Pursell a noté:
while (1)
{
# THIS LINE WILL KILL THE SCRIPT IF IT FAILS
my $DB;
eval {
$DB = DBI->connect("dbi:Sybase:server=myserver","user","password");
};
if ( my $ex = $@ ) {
warn $ex;
next;
}
# do something with $DB
continue {
sleep 10;
}
}
Voir aussi objet Gestion des exceptions orientée en Perl, est-il la peine? et Comment puis-je gérer le contrôle d'erreur propre à Perl?
Autres conseils
Je suis un peu perplexe:
my $DB=DBI->connect("dbi:Sybase:server=myserver","user","password");
ne devrait normalement pas mourir si elle ne peut pas se connecter. Normalement, il doit retourner un code d'erreur au lieu d'un db-poignée. Seulement si vous utilisez RAISERROR va mourir / lancer une exception.
my $DB=DBI->connect("dbi:Sybase:server=myserver","user","password",
{ RaiseError => 1});
Voir la DBI homme
De Programmation Perl :
sub try (&@) {
my($try,$catch) = @_;
eval { &$try };
if ($@) {
local $_ = $@;
&$catch;
}
}
sub catch (&) { $_[0] }
try {
die "phooey";
} catch {
/phooey/ and print "unphooey\n";
};