如何抑制来自 DBI 的任意警告/错误消息?

发布于 2025-01-08 10:59:57 字数 536 浏览 0 评论 0原文

代码:

# 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 会抑制错误消息,但我想知道如何在脚本中执行此操作?

code:

# 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 $@;

All would output :

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

I dont want this arbitrary warning/error message send to stderr. I'd like use warn $dbh->errstr.

perl a.pl 2>/dev/null would suppress the error message, but I want to know how to do this in script?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

静若繁花 2025-01-15 10:59:57

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

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

错误处理程序在 DBI POD 中进行了描述。

另一个选项是:

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

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

You need to install your own error handler. E.g.

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

Error handlers are described in DBI POD

Another options are to:

  • Set PrintWarn attribute to false value (courtesy of Sinan's answer on some forum

  • Trap all warnings via a signal handler: $SIG{'__WARN__'} = sub {};

自找没趣 2025-01-15 10:59:57

如今,我通常会执行以下操作

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

    使用 Try::Tiny;
    尝试 { $dbh->do(...) }
    catch { die $_ 除非/执行失败:重复条目/ };
    

这是我发现的最好方法 - INSERT IGNORE 忽略all< /em> 错误,而不仅仅是重复键错误,并且 REPLACE 将使用删除和插入覆盖现有行。可能会使用 INSERT INTO ... ON DUPLICATE KEY UPDATE id=id ,但我认为捕获错误更明确。

Nowadays I typically do the following

  1. Always pass RaiseError => 1, PrintError => 0 when creating a DBI handle. Now you don't have to add an error handler to every DBI call.
  2. For statements where I am unconcerned about Duplicate key errors, catch and ignore that exception:

    use Try::Tiny;
    try { $dbh->do(...) }
    catch { die $_ unless /execute failed: Duplicate entry/ };
    

This is the best way I've found - INSERT IGNORE ignores all errors, not just duplicate key errors, and REPLACE will overwrite the existing row using a delete and insert. INSERT INTO ... ON DUPLICATE KEY UPDATE id=id could possibly used, but I think catching the error is more explicit.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文