2015-12-10 27 views
-2

当查询失败时,我需要向数组添加一条错误消息。如何收集使用DBI执行语句时发生的错误?

这是我执行行:

$txnQuery[$t] = $sth_Data->execute(@argsIn); 

我想是这样的:

$txnQuery[$t] = $sth_Data->execute(@argsIn) or die push(@Error,"SQL Error"); 
+0

你正在尝试,并...发生了什么?脚本正在死亡? –

+0

打印此错误:1在E:\ StatementJSON.pl行395.我认为或只死在页面打印,它不能做任何其他行动。 –

+0

您看到的'1'可能是'@ Error'中的元素数量,这是'push'返回的值。不过,我不明白这个问题是什么。如果你不想让脚本退出,请不要调用'die'。 –

回答

3

DBI module提供PrintErrorRaiseError,并HandleError选项调整要如何处理错误上班。前两个都只是标志,但HandleError可以设置为一个子程序的参考,让您精确地要在错误

例如的事件发生什么写,你可以创建类似的RaiseError行为通过书写

$dbh->{HandleError} = sub { 
    my ($msg, $dbh, $ret) = @_; 
    die $msg; 
}; 

或者你可以积累一个错误列表,正如你所描述的那样,只需推入一个数组。像这样的事情,也许

my @errors; 

$dbh->{HandleError} = sub { 
    my ($msg, $dbh, $ret) = @_; 
    push @errors, $msg; 
}; 

如果你也想打印到控制台的消息,那么你可以warn $msg您的错误处理程序中,也可以简单地离开PrintError设置

您可能需要添加一个时间戳每个项目,你推到阵列上,并有可能使用数据库句柄参数$dbh$ret,这是失败的返回值方法

+0

谢谢先生,那是行得通的,我正在阅读其他DBI错误管理和'eval'这个句子。 –

+0

@BernadoBorunda:'eval'用于防止终止程序的致命错误。所以在这种情况下,你必须设置'RaiseError'来使错误成为致命的,然后使用'eval'来防止你的程序死亡,这似乎有点荒谬。另外,你必须在每个数据库操作上使用'eval',而为'HandleError'指定一个子例程只需要完成一次 – Borodin

相关问题