2009-08-15 12 views
0

Ich habe ein einfaches Perl-Skript, das als Linux-Daemon mit einer Endlosschleife läuft. Es verbindet sich alle 10 Sekunden mit einer Datenbank, um einen Prozess auszuführen.Wie kann ich verhindern, dass ein Fehler in meinem Perl-Skript das Skript beendet?

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); 
} 

Ich habe zwei Fragen:

  • Wenn die DB nicht verfügbar ist, wie ich das Skript halten kann ausgeführt werden?
  • Kann ich einen Ausnahme-Handler hinzufügen, um mir eine E-Mail zu senden oder einen Fehler zu protokollieren?
+4

Hinweis: Ihr Skript nicht alle zehn Sekunden keine Verbindung. Wenn die durchschnittliche Verbindung 1 Sekunde dauert, verbindet sich Ihr Skript (im Durchschnitt) alle 11 Sekunden. –

+0

Ich werde nicht sagen, ob Sie es nicht tun. :) – SkunkSpinner

Antwort

8

Diese in Intervallen von 10 Sekunden zu verbinden versucht, nicht alle 10 Sekunden, als William Pursell bemerkt:

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 = [email protected]) { 
     warn $ex; 
     next; 
    } 
    # do something with $DB 
    continue { 
     sleep 10; 
    } 
} 

Siehe auch Object Oriented Exception Handling in Perl, is it worth it? und How can I cleanly handle error checking in Perl?

+0

Ich glaube nicht, dass du meine $ DB innerhalb des Eval Blocks neu deklarieren willst. – xcramps

+0

@xcramps Danke, dass Sie es bemerkt haben und es mich wissen lassen. –

5

Ich bin ein wenig verwirrt:

my $DB=DBI->connect("dbi:Sybase:server=myserver","user","password"); 

sollte normalerweise nicht sterben, wenn es nicht verbinden kann. Normalerweise sollte ein Fehlercode statt eines db-handle zurückgegeben werden. Nur wenn du RaisError benutzt, wird es sterben/eine Ausnahme auslösen.

my $DB=DBI->connect("dbi:Sybase:server=myserver","user","password", 
         { RaiseError => 1}); 

Siehe DBI man-page

Verwandte Themen