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?
Était-ce utile?

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";
};
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top