如何在Perl中捕获“无法解码JSON”错误消息?

时间:2011-10-18 15:26:02

标签: json perl load-testing stderr

所以我正在尝试 加载 测试一个返回JSON值的REST API。

为此,我正在创建perl脚本的多个实例。

Perl脚本基本上调用该URL,并尝试decode_json。显然,当产生大量负载时,它就会失败。

现在我面临的问题是 - 命令提示符上显示错误,但不会在文件中写入错误消息。

错误消息是

malformed JSON string, neither array, object, number, string or atom, at character offset 0 (before "Can't connect to 209...") at json_load_test.pl line 39.

在第39行的所有三次尝试中,指的是:

decode_json($actual_response);

我只是在命令提示符下运行脚本:

perl json_load_test.pl >> logs/output.txt 

我预计会在“output.txt”中写下错误信息

我的三次失败的尝试如下。

尝试1:

my $ua = LWP::UserAgent->new;
$ua->timeout(3);    
$ua->env_proxy;        
my $response = $ua->get("http://$j_env/jobs/all.json?status=active");
my $actual_response=$response->decoded_content;
decode_json($actual_response);
if ($? == -1)
{print "\n Failed to execute: $!\n"; }

尝试2:

my $ua = LWP::UserAgent->new;
$ua->timeout(3);    
$ua->env_proxy;        
my $response = $ua->get("http://$j_env/jobs/all.json?status=active");
my $actual_response=$response->decoded_content;
my $perl_scalar= decode_json($actual_response);
if ($perl_scalar)
{ok(1,"For process $u2 inside counter $counter ");}
else
{ok(0,"FAILED!!! process $u2 inside counter $counter");}

尝试3:

my $ua = LWP::UserAgent->new;
$ua->timeout(3);    
$ua->env_proxy;        
my $response = $ua->get("http://$j_env/jobs/all.json?status=active");
my $actual_response=$response->decoded_content;
decode_json($actual_response) or die "FAILED!!!!";

1 个答案:

答案 0 :(得分:20)

看起来您的错误消息来自stderr,而不是stdout。因此,

perl json_load_test.pl >> logs/output.txt 2>> logs/errors.txt

或者那种效果。如果你想在一个文件中同时使用:

perl json_load_test.pl 2>&1 >> logs/output.txt

修改

如果由于某种原因你想在perl中捕获错误并将其发送到stdout,你可以:

eval {
  decode_json($actual_response);
  1;
} or do {
  my $e = $@;
  print "$e\n";
};

<强> EDIT2:

正如daxim在编辑笔记中指出的那样,Try :: Tiny可能更简单:

use Try::Tiny;
try {
  decode_json($actual_response);
} catch {
  print "$_\n";
};