在某些部分禁用 DBI HandleError

Disable DBI HandleError in certain sections

有没有办法在脚本的某些部分“关闭”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 仅仅因为其中一个表的内容无法删除而终止脚本。我想手动处理错误。

HandleError attribute can be changed at all times. Since you access it directly by going into the hash reference inside your $dbh, you can simply local对其进行处理。

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

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

{
    local $dbh->{HandleError} = sub {
        my (undef, $error) = @_
        Log("ERROR: Delete failed ($error)");
    };

    for my $table (@db_tables){
        $dbh->do("delete from $table") 
            and Log("Table [$table] content was deleted");
    }
}

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