在某些部分禁用 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");
}
}
在这两种情况下,只有当此范围内的代码以及其中的任何范围内的代码为 运行 时,该值才会被覆盖。作用域结束后会自动恢复
有没有办法在脚本的某些部分“关闭”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");
}
}
在这两种情况下,只有当此范围内的代码以及其中的任何范围内的代码为 运行 时,该值才会被覆盖。作用域结束后会自动恢复