Sql server 如何将运行时mssql错误存储在变量中并继续在perl中运行?

Sql server 如何将运行时mssql错误存储在变量中并继续在perl中运行?,sql-server,perl,dbi,Sql Server,Perl,Dbi,我试图将运行时mssql错误存储在变量中,并继续处理所有其他数据 my $sth = $dbh->prepare("exec TEST_ABC_DB.dbo.testprocedure"); $sth->execute() ; my $db_error =$DBI::errstr; #It didn't work also I tried err and state print "\nDB error $db_error\n"; while (@row = $sth->fetc

我试图将运行时mssql错误存储在变量中,并继续处理所有其他数据

my $sth = $dbh->prepare("exec TEST_ABC_DB.dbo.testprocedure");
$sth->execute() ;
my $db_error =$DBI::errstr; #It didn't work also I tried err and state
print "\nDB error $db_error\n";
while (@row = $sth->fetchrow_array( ) ) 
{
      print "Row: @row\n";
}
我使用了eval块,但它也不起作用

我的程序如下(示例)

当我运行脚本时,它会显示

输出是

Row: one
DBD::ODBC::st finish failed: [unixODBC][FreeTDS][SQL Server]Divide by zero error encountered. (SQL-22012) at testing.pl line 24.
DBI::db=HASH(0xbe79a0)->disconnect invalidates 1 active statement handle (either destroy statement handles or call finish on them before disconnecting) at testing.pl line 28.
即使
三个
也不显示输出。仅显示一个

PrintErrorHandle属性告诉DBI调用Perl警告() 函数(通常会导致将错误打印到 遇到时显示屏幕)和RaiseError句柄属性(其中 告诉DBI在出现错误时调用Perl die()函数,通常是 导致脚本立即中止)。-

因此,您可以使用下面的方法来处理这种情况

local $SIG{__DIE__} = sub {
    my ($die_message) = @_;
    #do something..
};
我正在尝试将错误存储在变量中

在上述代码段中,
$die_message
将包含错误消息


另一个选项是将
RaiseError
设置为0,将
PrintError
设置为1,这样您可以得到
警告
提示,但程序不会
死亡

打印错误

PrintError属性可用于强制生成错误 除了在中返回错误代码之外,还提供警告(使用warn) 正常的方式。当设置为“开”时,任何导致错误的方法 发生此事件将导致DBI有效地执行
warn($class$方法)
失败:$DBI::errstr“
其中
$class
是驱动程序类,并且
$method
是失败的方法的名称

RaiseError

RaiseError属性可用于强制引发错误 异常而不是简单地以正常方式返回错误代码。信息技术 默认情况下为“关闭”。当设置为“on”时,任何导致 错误将导致DBI有效地执行
die(“$class$method”)
失败:$DBI::errstr“
,其中
$class
是驱动程序类,而
$method
是失败的方法的名称

来源-


您也可以通过以下方式手动执行此操作:

my $dbh=DBI->connect(....{RaiseError=>1}) or die...
my $sth=$dbh->prepare(...);
{
   local $dbh->{RaiseError} = 0;
   $sth->execute;
   if ($sth->Errstr) {
       # handle the error
   }
}
# $dbh->{RaiseError} is back to normal here

我从答案中得到了我问题的答案

最后的答案是

do
{ 
while(my @row=$sth->fetchrow_array())
{
    if ($sth->errstr) 
    {
        my $Error = $sth->errstr;   

    }
    print $row[0]."\n\n";
}
} while ($sth->{odbc_more_results});

若要在过程本身中执行此操作,可以使用Try..Catch块执行异常处理。请参阅此处的文档
https://msdn.microsoft.com/en-us/library/ms175976.aspx
您想继续脚本,只捕获错误吗?@AbhiNickz是的,我想继续脚本。看看这个@AbhiNickz,我试过了,但没有成功。报告相同的错误。为什么不简单地从
RaiseError
切换到
PrintError
?@Chankeypathak如何防止dbi
中止
?@mkHun正如dgw提到的那样,关闭RaiseError并启用PrintError将阻止中止。@Chankeypathak我一个问题一个问题地得到了答案。我也用了你的伎俩。谢谢你的帮助。
do
{ 
while(my @row=$sth->fetchrow_array())
{
    if ($sth->errstr) 
    {
        my $Error = $sth->errstr;   

    }
    print $row[0]."\n\n";
}
} while ($sth->{odbc_more_results});