首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法捕获DBI错误

无法捕获DBI错误
EN

Stack Overflow用户
提问于 2014-12-02 21:20:13
回答 1查看 749关注 0票数 3

我正在编写一个Perl脚本,无论我尝试了什么,我似乎都无法捕捉DBI错误。我试过这个:

代码语言:javascript
复制
use DBI;

$db = DBI->connect("dbi:ODBC:Driver={SQL Server};Server=localhost;DATABASE=nodepoint;UID=sa;PWD=test;") or print "Something happened.";

这是:

代码语言:javascript
复制
use DBI;

eval
{
    $db = DBI->connect("dbi:ODBC:Driver={SQL Server};Server=localhost;DATABASE=nodepoint;UID=sa;PWD=test;");
};
if ($@) { print "Something happened."; }

两者都无法捕捉到错误,相反,我在屏幕上看到了这样的信息:

代码语言:javascript
复制
DBI connect('Driver={SQL Server};Server=localhost;DATABASE=nodepoint;UID=sa;PWD=test','',...) failed: [Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server does not exist or access denied. (SQL-08001) [state was 08001 now 01000]
[Microsoft][ODBC SQL Server Driver][DBNETLIB]ConnectionOpen (Connect()). (SQL-01000) at C:\dev\test.pl line 5.

这是一个大问题,因为当在IIS上使用时,当它看到错误时会抛出一个500.2 Bad Gateway。我需要抓住它,这样我才能显示一个正确的信息。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-02 21:42:31

默认的错误处理是:

代码语言:javascript
复制
RaiseError => 0
PrintError => 1
PrintWarn  => 0

您想将PrintError => 0传递给connect

如果您喜欢检查错误:

代码语言:javascript
复制
my $dbh = DBI->connect($dsn, $user, $passwd, {
   RaiseError => 0,
   PrintError => 0,
});

if (!$dbh) {
   die($DBI::errstr);
}

如果您希望引发异常:

代码语言:javascript
复制
my $dbh = eval {
   DBI->connect($dsn, $user, $passwd, {
      RaiseError => 1,
      PrintError => 0,
   })
};

if (!$dbh) {
   die($@);
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27259174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档