PERL - 在某些部分禁用DBI HandleError

时间:2017-11-29 14:28:54

标签: perl dbi

有没有办法在脚本的某些部分“关闭”Perl中的DBI HandleError属性,就像可以关闭RaiseError一样?

示例:

my $dbh = DBI->connect("DBI:SQLite:dbname=file.db","","",{ PrintError => 0, RaiseError => 0, 
                                                           HandleError => sub{ Log("ERROR: Something failed in db"); exit 1 } }) 
        or die "Couldn't connect";

for my $table (@db_tables){
  $dbh->do("delete from $table") 
          or do{ Log("ERROR: Delete failed"); next };

  Log("Table [$table] content was deleted");
}

exit 0;

这里我不希望HandleError因为无法删除其中一个表的内容而终止脚本。我想手动处理错误。

1 个答案:

答案 0 :(得分:5)

HandleError attribute可以随时更改。由于您通过进入TypeError: this is undefined内的哈希引用直接访问它,因此您只需local即可。

$dbh

更好的实现方法是正确处理错误,并且只设置一次本地化。为此,在循环周围创建一个外部范围。

for my $table (@db_tables){
    local $dbh->{HandleError}; # it's now undef
    $dbh->do("delete from $table") 
          or do{ Log("ERROR: Delete failed"); next };

    Log("Table [$table] content was deleted");
}

在这两种情况下,只有在此范围内的代码及其中的任何范围运行时,才会覆盖该值。范围结束后,它将自动恢复。