【问题标题】:Perl DBI module do not raise exceptionPerl DBI 模块不引发异常
【发布时间】:2019-06-15 05:11:27
【问题描述】:

我尝试在 do() 方法中运行一些将失败的语句,其中 DBI RaiseError 标志为 ON,但它不会引发异常。

use strict;
use warnings;
use DBI;

my $dbh = DBI->connect("DBI:mysql:database=test;host=192.168.10.101",
                        "test", "123456", {'RaiseError' => 1});

eval { $dbh->do("DROP TABLE foo") }; # foo table not exist
if ($@) {
    print "Dropping foo failed: $@\n";
} else {
    print "ok\n";
}

此代码返回 ok 而不是错误。

我只在 Windows 7 机器上遇到这个问题。 (当我在 Linux 上运行此代码时会引发异常。)这是一个错误吗?

Perl 版本:5.16.3, DBI 版本:1.623, DBD::mysql 版本:4.022

【问题讨论】:

  • 它会引发异常,但您可以使用eval { ... } 捕获并丢弃它。啊,这实际上是你想要做的。删除eval { ... } 时是否出现错误?那就试试my $run_ok = eval { $dbh->do("DROP TABLE foo");1 }; my $err = $@; if( ! $run_ok ) { warn "<<$err>>" }
  • 我不确定是否是问题所在,但不要测试$@ 以查看是否发生异常,让 eval 返回一个真值并测试其返回值。请参阅 mvp.kablamo.org/essentials/die-eval 或尝试更直观的 try/catch 语法 mvp.kablamo.org/essentials/try-catch

标签: mysql windows dbi perl


【解决方案1】:

将 DBD::mysql 更新到最新版本对我有帮助。

【讨论】:

    猜你喜欢
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多