【发布时间】: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