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

eve*_*box 3 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 $@;
Run Code Online (Sandbox Code Playgroud)

所有输出:

DBD::mysql::db do failed: Duplicate entry 'test' for key 'cl' at a.pl line 9.
Run Code Online (Sandbox Code Playgroud)

我不希望这个任意警告/错误消息发送到stderr.我想用warn $dbh->errstr.

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

DVK*_*DVK 8

您需要安装自己的错误处理程序.例如

$dbh->do($statement, { HandleError => \&handle_error });
Run Code Online (Sandbox Code Playgroud)

DBI POD中描述了错误处理程序

另一种选择是:

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

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