在Perl中如何捕获“failed to decode JSON”错误消息?

10
我正在尝试对返回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"; }

Attempt 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个回答

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";
};

编辑2:

如daxim在编辑注释中指出,Try::Tiny可能更简单:

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

2
在Unix中,这是perl json_load_test.pl > logs/output.txt 2>&1 logs/errors.txt - user3458
2
@Arkadiy 公正地说,原帖并没有说明他们正在使用Unix还是我编造的操作系统。 - Tamzin Blake
非常抱歉信息不足,我确实使用Unix来运行该命令。 - Amey
1
@perlnewbie 如果你想控制错误信息是什么,你可以选择 1)重写 JSON 模块以输出不同的错误信息(不建议),或者 2)使用我发布的 eval 方法并打印 $e 的其他内容。 - Tamzin Blake
应该是这样的:eval { decode_json($actual_response); 1; } or do { my $e = $@; print "$e\n"; }; - Eric Klien
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接