【问题标题】:eval not printing "Hello World" and still outputs to stderreval 不打印“Hello World”并且仍然输出到 stderr
【发布时间】:2020-09-15 05:25:14
【问题描述】:

我希望 Perl 或 DBI 在连接到数据库时出现错误时不发送错误异常。我的目标是一旦我无法通过用户名/密码或 URL 问题连接到数据库,就将代码发送到我的监控服务器。

#!/usr/bin/perl -w
use strict;

use DBI;
use Data::Dumper;

my $dsn = 'DBI:ODBC:Driver={/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.5.so.2.1}';
my $host = 'whatever.com,1433';
my $database = 'xxxxx';
my $user = 'xxxxx';
my $auth = 'xxxxxxx';

eval {
my $dbh = DBI->connect("$dsn;Server=$host;Database=$database",
$user,
$auth);
};


if ($@) {
  print "Hello World.\n";
  ## Eventually, I'll put code here to send alerts to the monitoring server
}

即使使用 eval,Perl/DBI 仍然会输出错误并且不会打印“Hello World”。

DBI connect('Driver={/opt/microsoft/msodbcsql17/lib64/libmsodbcsql- 
17.5.so.2.1};Server=xxxxx- 
xxxxxxx.com,1433;Database=xxxxxx','xxxxuser1',...) failed: [Microsoft][ODBC Driver 
17 for SQL Server][SQL Server]Login failed for user 'xxxxuser1'. (SQL-28000) at ./x.pl 
line 14.

【问题讨论】:

  • 将第四个参数传递给connect{ PrintError => 0, RaiseError => 1 }(现在无法写出完整的答案)
  • @ikegami 工作,请打印完整答案,以便获得信用

标签: perl dbi


【解决方案1】:

默认情况下,DBI 方法向 STDERR 打印错误消息并在错误时返回 false。

要启用在错误时引发异常,请使用以下选项:

RaiseError => 1

要禁用打印到 STDERR,请使用以下选项:

PrintError => 0

(这不会阻止将未捕获的异常输出到 STDERR。)

这就是它的样子:

my $dbh = DBI->connect(
   "$dsn;Server=$host;Database=$database",
   $user, $auth,
   { PrintError => 0, RaiseError => 1 },
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-11
    • 2016-02-16
    • 1970-01-01
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    相关资源
    最近更新 更多