如何防止Perl脚本中的错误终止脚本?

Sku*_*ner 0 linux perl daemon exception-handling

我有一个简单的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);
}
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

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

Sin*_*nür 8

试图以10秒的间隔连接,而不是每隔10秒,如William Pursell所说:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

另请参阅Perl中的面向对象异常处理,值得吗?我怎样才能干净地处理错误在Perl检查?


bje*_*lli 5

我有点不解:

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

如果无法连接,通常不应该死.通常它应该返回错误代码而不是db-handle.只有在使用RaisError时才会死/抛出异常.

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

请参阅DBI手册页