0

我有一个简单的 Perl 脚本,它使用无限循环作为 Linux 守护程序运行。它每 10 秒连接到一个数据库以执行一个进程。

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

我有两个问题:

  • 如果数据库不可用,如何保持脚本运行?
  • 我可以添加异常处理程序来向我发送电子邮件或记录错误吗?
4

3 回答 3

8

正如 William Pursell 所指出的,这会尝试以 10 秒的间隔连接,而不是每 10 秒连接一次:

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

另请参阅Perl 中的面向对象异常处理,值得吗?以及如何在 Perl 中干净地处理错误检查?

于 2009-08-15T12:48:27.143 回答
5

我有点纳闷:

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

如果无法连接,通常不会死机。通常它应该返回一个错误代码而不是一个数据库句柄。只有当您使用 RaisError 时,它才会死亡/抛出异常。

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

请参阅DBI 手册页

于 2009-08-15T19:09:28.670 回答
1

编程 Perl

sub try (&@) {
     my($try,$catch) = @_;
     eval { &$try };
     if ($@) {
         local $_ = $@;
         &$catch;
     }
}
sub catch (&) { $_[0] }

try {
    die "phooey";
} catch {
    /phooey/ and print "unphooey\n";
};
于 2009-08-15T12:52:06.437 回答