Как я могу поймать сообщение об ошибке «не удалось декодировать JSON» в Perl? - PullRequest
10 голосов
/ 18 октября 2011

Итак, я пытаюсь загрузить проверить REST API, который возвращает значение JSON.

Для этого я создаю несколько экземпляров сценария perl.

Сценарий Perl обычно вызывает этот URL и пытается decode_json.Очевидно, что при значительной загрузке происходит сбой.

Теперь проблема, с которой я сталкиваюсь, - это ошибка, отображаемая в командной строке, но не записывающая это сообщение об ошибке в файл.

Сообщение об ошибкеis

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 Ответ

20 голосов
/ 18 октября 2011

Похоже, ваше сообщение об ошибке исходит от 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 и отправить ее на стандартный вывод,Вы могли бы:

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

EDIT2:

Как указывает даксим в примечаниях по редактированию, Try :: Tiny может быть проще:

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