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

Ame*_*mey 10 perl json load-testing stderr

所以我试图加载测试REST API,它返回一个JSON值.

为此,我创建了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);
Run Code Online (Sandbox Code Playgroud)

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

perl json_load_test.pl >> logs/output.txt 
Run Code Online (Sandbox Code Playgroud)

我期待在"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"; }
Run Code Online (Sandbox Code Playgroud)

尝试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");}
Run Code Online (Sandbox Code Playgroud)

尝试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!!!!";
Run Code Online (Sandbox Code Playgroud)

Tam*_*ake 20

看起来您的错误消息来自stderr,而不是stdout.从而,

perl json_load_test.pl >> logs/output.txt 2>> logs/errors.txt
Run Code Online (Sandbox Code Playgroud)

或者那种效果.如果你想在一个文件中:

perl json_load_test.pl 2>&1 >> logs/output.txt
Run Code Online (Sandbox Code Playgroud)

编辑:

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

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

EDIT2:

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

use Try::Tiny;
try {
  decode_json($actual_response);
} catch {
  print "$_\n";
};
Run Code Online (Sandbox Code Playgroud)

  • 在Unix中,这是`perl json_load_test.pl> logs/output.txt 2>&1 logs/errors.txt` (2认同)
  • @Arkadiy公平地说,OP没有说明他们是使用Unix还是我刚刚编写的操作系统. (2认同)