NEWS
Fehler abfangen? z.B. nich vorhandene Variablen an Funktion
-
Ich habe heute den halben Tag daran gesessen im Javascript-Adapter Fehler abzufangen und bin leider daran gescheitert.
Beispielfunktion:
hueGruppe(hueGruppeWohnzimmer,"blue",1000,50);
Bei den ersten beiden Parametern der Funktion soll bei Tippfehlern das Script nicht abbrechen.
Der erste Parameter ist der Name eines Arrays.
Der zweite Parameter ist ein Name aus einem JSON.
Der Anfang des JSON:
var huePresets = { "standard": { // Standardfarbe der hue bei Power on "hue": 14922, "sat": 144, "bri": 254, "effect": "none", "alert": "none" }, "blue": { // blau "hue": 47125, "sat": 254,
Bei einem Tippfehler bricht das Script komplett ab, bzw. der Javascript Adapter wird neu gestartet.
Hier ein extra provozierter Fehler (JSON Presetname bewusst falsch geschrieben):
TypeError: 2015-07-26 19:35:46 error Cannot call method 'hasOwnProperty' of undefined uncaught 2015-07-26 19:35:46 error exception: Cannot call method 'hasOwnProperty' of undefined javascript-0 2015-07-26 19:35:46 info script.js.FUNKTIONEN_hue: registered 0 subscriptions and 0 schedules
Ich habe nun stundenlang probiert und gegoogelt… nichts hat gegriffen
Aus dem Kopf (es war bei den Versuchen bestimmt richtig) :
if (typeof preset === "undefined" if (preset === undefined) íf (!preset)
Funktionen, …. und was weiss ich noch alles.
-
Wie sieht deine hueGruppe aus?
-
In dem speziellen Fall geht es um das Script hier:
http://forum.iobroker.org/viewtopic.php … 85cf#p8657
Die Gruppen sind z.B. so definiert:
// hue IDs (Channel) - Namen können frei vergeben werden var idHueGästebadVorne = "hue.0.Philips_hue.20.1_Gästebad_Vorne"; /*Philips_hue.20.1_Gästebad_Vorne*/ var idHueGästebadHinten = "hue.0.Philips_hue.20.2_Gästebad_Hinten"; /*Philips_hue.20.2_Gästebad_Hinten*/ var idHueWohnzimmerKugel = "hue.0.Philips_hue.10.4_Wohn_Kugel"; /*Philips_hue.10.4_Wohn_Kugel*/ // hue Gruppen - Die Namen der IDs können beliebigen Gruppen zugeordnet werden var hueGruppeGästebad = [idHueGästebadVorne,idHueGästebadHinten]; var hueGruppeWohnzimmer = [idHueWohnzimmerKugel];
Mir geht es dabei eher um die grundsätzliche Funktion.
Wenn ich hier Scripte reinstelle sollen die sich nicht direkt bei einem Tippfehler verabschieden.
-
Ändere Zeile:
if(huePresets[preset].hasOwnProperty(hueParameter[j])){
auf
if(huePresets[preset] && huePresets[preset].hasOwnProperty(hueParameter[j])){
Man kann grundsätzlich sich gegen alle Fehler schützen in dem man das Block, wo Fehler eventuell auftauchen können in das:
`function hueGruppe (gruppe,preset,verzögerung,bri) { if (!gruppe) return; // if(!verzögerung) verzögerung = 10; setTimeout(function() { // Preset verzögert aktivieren, wenn eingestellt try { for (i = 0; i < gruppe.length; i++) { // jede Lampe aus der Gruppe //setState(hueLichter[i] + ".colormode","ct"); for (j = 0; j < hueParameter.length; j++) { // teste alle möglichen hue Parameter if(huePresets[preset] && huePresets[preset].hasOwnProperty(hueParameter[j])){ // nur die im Preset enthaltenen Variablen verarbeiten if (hueParameter[j] != "bri") { // bri rausnehmen, da ggf. eigener Wert mitgegeben wurde setState(gruppe[i] + "." + hueParameter[j], huePresets[preset][hueParameter[j]] ); log(hueParameter[j] + ": " + huePresets[preset][hueParameter[j]],"debug"); } else { // es handelt sich um bri if (!validBri(bri)) { // prüfen, ob ein gültiger bri Wert vom Anwender übergeben wurde setState(gruppe[i] + "." + hueParameter[j], huePresets[preset][hueParameter[j]] ); log(hueParameter[j] + ": " + huePresets[preset][hueParameter[j]],"debug"); } else { setState(gruppe[i] + ".bri", bri); // wenn ein Helligkeitswert übergeben wurde, diesen verwenden log(hueParameter[j] + ": " + bri,"debug"); } } } } } } catch (e) { log(e, 'error'); } }, verzögerung); return null; }` Block platziert. (Das ist aber eher gegen unbekannten Fehler)[/i][/i][/i][/i]
-
Ändere Zeile:
if(huePresets[preset].hasOwnProperty(hueParameter[j])){
auf
if(huePresets[preset] && huePresets[preset].hasOwnProperty(hueParameter[j])){ ```` `
Das hat leider nicht funktioniert.
Wenn ich den Gruppennamen bewusst falsch schreibe erhalte ich beim Start des Scriptes immer noch den Fehler:
javascript-0 2015-07-27 06:34:50 error at script.js.FUNKTIONEN_hue:214:11 javascript-0 2015-07-27 06:34:50 error script.js.FUNKTIONEN_hue: ReferenceError: hueGruppeArbeitszimer is not defined javascript-0 2015-07-27 06:34:50 info Start javascript script.js.FUNKTIONEN_hue
Und das Script bricht ab.
Danach habe ich try/catch eingebaut. Ich bekomme aber trotzdem den Fehler oben und da Script bricht ab. :?
P.S.: da ich das Script hinterher global verwenden möchte, benötige ich die Variablen dort zum Teil auch global. Muss ich da was beachten, z.B. "_global" am Variablenamen anhängen?
-
Ändere Zeile:
if(huePresets[preset].hasOwnProperty(hueParameter[j])){
auf
if(huePresets[preset] && huePresets[preset].hasOwnProperty(hueParameter[j])){ ```` `
Das hat leider nicht funktioniert.
Wenn ich den Gruppennamen bewusst falsch schreibe erhalte ich beim Start des Scriptes immer noch den Fehler:
javascript-0 2015-07-27 06:34:50 error at script.js.FUNKTIONEN_hue:214:11 javascript-0 2015-07-27 06:34:50 error script.js.FUNKTIONEN_hue: ReferenceError: hueGruppeArbeitszimer is not defined javascript-0 2015-07-27 06:34:50 info Start javascript script.js.FUNKTIONEN_hue
Und das Script bricht ab.
Danach habe ich try/catch eingebaut. Ich bekomme aber trotzdem den Fehler oben und da Script bricht ab. :?
P.S.: da ich das Script hinterher global verwenden möchte, benötige ich die Variablen dort zum Teil auch global. Muss ich da was beachten, z.B. "_global" am Variablenamen anhängen? `
Die Variable solltest du vor erste Verwendung checken:if (typeof hueGruppeWohnzimmer != 'undefined') { hueGruppe(hueGruppeWohnzimmer,"standard"); // (1) hueGruppe(hueGruppeWohnzimmer,"effectColorloop",3000); // (2) hueGruppe(hueGruppeWohnzimmer,"blue",5000); // (3) hueGruppe(hueGruppeWohnzimmer,"blue",1000,50); // (4) hueGruppe(hueGruppeWohnzimmer,"effectOff",7000); // (5) hueGruppe(hueGruppeWohnzimmer,"off",9000); // (6) }
-
Die Variable solltest du vor erste Verwendung checken:
if (typeof hueGruppeWohnzimmer != 'undefined') { hueGruppe(hueGruppeWohnzimmer,"standard"); // (1) hueGruppe(hueGruppeWohnzimmer,"effectColorloop",3000); // (2) hueGruppe(hueGruppeWohnzimmer,"blue",5000); // (3) hueGruppe(hueGruppeWohnzimmer,"blue",1000,50); // (4) hueGruppe(hueGruppeWohnzimmer,"effectOff",7000); // (5) hueGruppe(hueGruppeWohnzimmer,"off",9000); // (6) } ```` `
OK. Danke für die Info!
Ich teste das nachher. Schade, dass es nicht anders funktioniert. Der Scriptstart am Ende des Scripts ist nur ein Beispiel, um die Funktion zu testen.
D.h. die Funktion hueGruppe() soll hinterher in diversen Scripts eingesetzt werden. Ist dann nicht mehr "so einfach" zu verwenden, wenn das dann ggf. noch Andere einsetzen.