Wie kann ich fangen eine "failed to decode JSON" Fehlermeldung in Perl?
So, ich bin versucht, laden testen einer REST-API gibt JSON-Wert.
Zu tun, dass ich das erstellen mehrerer Instanzen des perl-Skripts.
Dem Perl-script im Grunde ruft diese URL auf und versucht decode_json
. Natürlich, wenn erhebliche Last erzeugt wird, schlägt es fehl.
Nun das problem, das ich konfrontiert ist - Ein Fehler wird angezeigt, auf Eingabeaufforderung, aber nicht schreiben, dass die Fehlermeldung in eine Datei.
Die Fehlermeldung ist
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.
In alle drei versuche unter Zeile 39 bezieht sich auf:
decode_json($actual_response);
Ich bin einfach läuft das Skript auf der Kommandozeile als:
perl json_load_test.pl >> logs/output.txt
ERWARTE ich DIE FEHLERMELDUNG GESCHRIEBEN WERDEN "output.txt"
Meine drei fehlgeschlagen versuche sind wie folgt.
Versuch 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"; }
Versuch 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");}
Versuch 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!!!!";
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sieht es aus wie deine Fehlermeldung kommt von stderr, nicht auf stdout. So,
Oder etwas zu diesem Effekt. Wenn Sie möchten, dass beide in einer Datei:
EDIT:
Wenn Sie aus irgendeinem Grund wollten die trap-Fehler in der perl und senden Sie es an stdout, Sie könnten:
EDIT2:
Als daxim Punkte in den Notizen Bearbeiten, Try::Tiny ist vielleicht einfacher:
perl json_load_test.pl > logs/output.txt 2>&1 logs/errors.txt
eval
Methode, die ich geschrieben und drucken, etwas anderes anstelle von$e
.eval { decode_json($actual_response); 1; } or do { my $e = $@; print "$e\n"; }
sollteeval { decode_json($actual_response); 1; } or do { my $e = $@; print "$e\n"; };