如何从DBI中抑制任意警告/错误消息?

时间:2012-02-23 03:04:06

标签: perl

代码:

# A:
$dbh->do(qq/insert into foo(cl) values('test')/);
# B:
$dbh->do(qq/insert into foo(cl) values('test')/) or warn $dbh->errstr;
# C:
eval { $dbh->do(qq/insert into foo(cl) values('test')/); };
warn "error : $@ " if $@;

所有输出:

DBD::mysql::db do failed: Duplicate entry 'test' for key 'cl' at a.pl line 9.

我不希望将此任意警告/错误消息发送给stderr。我想使用warn $dbh->errstr

perl a.pl 2>/dev/null会抑制错误消息,但我想知道如何在脚本中执行此操作?

2 个答案:

答案 0 :(得分:8)

您需要安装自己的错误处理程序。 E.g。

$dbh->do($statement, { HandleError => \&handle_error });

DBI POD

中描述了错误处理程序

另一个选择是:

  • PrintWarn属性设置为 false 值(由Sinan在某个论坛上的回答提供

  • 通过信号处理程序捕获所有警告:$SIG{'__WARN__'} = sub {};

答案 1 :(得分:2)

现在我通常会做以下

  1. 创建DBI句柄时始终传递RaiseError => 1PrintError => 0。现在您不必为每个DBI调用添加错误处理程序。
  2. 对于我不关心重复键错误的语句,请捕获并忽略该异常:

    use Try::Tiny;
    try { $dbh->do(...) }
    catch { die $_ unless /execute failed: Duplicate entry/ };
    
  3. 这是我发现的最佳方式 - INSERT IGNORE忽略所有错误,而不仅仅是重复的错误,而REPLACE将使用删除覆盖现有行插入。可能会使用INSERT INTO ... ON DUPLICATE KEY UPDATE id=id,但我认为捕获错误更明确。