有没有办法在脚本的某些部分“关闭”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因为无法删除其中一个表的内容而终止脚本。我想手动处理错误。
答案 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");
}
在这两种情况下,只有在此范围内的代码及其中的任何范围运行时,才会覆盖该值。范围结束后,它将自动恢复。