In meinem Modul LuftdatenInfo bekomme ich ein JSON von einer HTTP abfrage zurück. Manchmal jedoch nicht und dann bleibt FHEM hängen weil ich das nicht überprüfe.
Wie könnte so eine Überprüfung aussehen ob "$data = decode_json($data);" einen Fehler auswirft?
Wieso bleibt FHEM haengen, wenn die Daten leer/kaputt sind?
Verwendest du HttpUtils_NonblockingGet?
das JSON modul liefert leider keine fehler sondern beendet sich komplett wenn es fehler gibt.
deshalb sollte man das ganze immer nur mit einem eval aufrufen:my $obj = eval { decode_json($json) };
und dananach $@ prüfen.
gruss
andre
volle Zustimmung!
Ist sogar noch schlimmer, es gibt mittlerweile verschiedene perl JSON Modul (und versionen). Die behandeln dann auch UTF8 noch unterschiedlich. Wenn da was drin ist was die nicht wollen crashen die ohne jede Vorwarnung.
Abstrakt: JSON immer(!) im eval und mit allem rechnen.
vg
joerg
Zitat von: rudolfkoenig am 09 Mai 2017, 10:23:56
Wieso bleibt FHEM haengen, wenn die Daten leer/kaputt sind?
Verwendest du HttpUtils_NonblockingGet?
Warum es das macht weiß ich nicht. HttpUtils_NonblockingGet wird verwendet.
Für den Fehler siehe:
Zitat von: Frank_Huber am 07 Mai 2017, 21:46:33
Nur der Vollständigkeit halber:
2017.05.07 18:20:46 2: LuftdatenInfo (Luftdaten_Wolfartsweiher) - error while request: read from http://api.luftdaten.info:80 timed out
malformed JSON string, neither array, object, number, string or atom, at character offset 0 (before "<!DOCTYPE HTML PUBLI...") at ./FHEM/59_LuftdatenInfo.pm line 265.
Bei 3 fhem crashes heute die letzte log Zeile.
Gesendet von meinem S3_32 mit Tapatalk
Zitat von: justme1968 am 09 Mai 2017, 10:43:20
das JSON modul liefert leider keine fehler sondern beendet sich komplett wenn es fehler gibt.
deshalb sollte man das ganze immer nur mit einem eval aufrufen:my $obj = eval { decode_json($json) };
und dananach $@ prüfen.
gruss
andre
Vielen dank, kann ich das dann wie folgt umsetzen?
$data = eval{decode_json($data)};
if($@){
Log3($SELF, 2, "$TYPE ($SELF) - error while request: $@");
readingsSingleUpdate($hash, "state", "error", 1);
return;
}
ja. genau.
ZitatBei 3 fhem crashes heute die letzte log Zeile.
Das klingt aber nicht nach "haengen". Die Unterschiedung ist mir wichtig, da ich mich fuer Haenger eher zustaendig fuehle, als fuer Crashes :)
Zitat von: rudolfkoenig am 09 Mai 2017, 12:54:23
Das klingt aber nicht nach "haengen". Die Unterschiedung ist mir wichtig, da ich mich fuer Haenger eher zustaendig fuehle, als fuer Crashes :)
Okay, mein Fehler: FHEM stürzt ab und ist danach nicht mehr zu erreichen. Ob der FHEM Prozess beendet wurde habe ich nicht überprüft.
Zitat von: igami am 09 Mai 2017, 13:00:16
Okay, mein Fehler: FHEM stürzt ab und ist danach nicht mehr zu erreichen. Ob der FHEM Prozess beendet wurde habe ich nicht überprüft.
Habe grade von Frank die Nachricht bekommen, dass der Prozess beendet wurde.
ja klar. json crashed im modul und reist fhem komplett mit.
Danke für das Beispiel, hab's in meinen Modulen gleich mal übernommen.