Wann immer du Programme schreibst (von den einfachsten bis hin zu den anspruchsvollsten), wirst du unweigerlich auf Fehler stoßen, die dazu führen, dass das Programm nicht richtig funktioniert. Aufgrund der Natur des Sandkastens kann es etwas schwierig sein, genau zu erkennen, was gerade vor sich geht. Hier sind ein paar Tipps, die du nutzen kannst, um Probleme mit deinen Skripten zu diagnostizieren.
„Caveman“-Debugging
Da du keinen direkten Zugriff auf die Umgebung hast, in der die Skripte ausgeführt werden, kannst du dich auf zahlreiche log()-Aufrufe verlassen, um zu erfahren, was in deinem Programm vor sich geht. Wenn du zum Beispiel nicht sicher bist, warum sich ein Spielmarker nicht richtig bewegt, und du einen Einblick in die Werte erhalten möchtest, die hin und her gereicht werden, könntest du Folgendes tun:
on("change:graphic:left", function(obj) {
//Wie lautet der Wert für „left“ des Objekts, das hier reinkommt?
log(obj.get("left"));
obj.set("left", obj.get("left") + 70);
//Wie sieht’s jetzt aus?
log(obj.get("left"));
//Du kannst auch ganze Objekte debuggen, um eine Liste ihrer aktuellen Attribute anzuzeigen
log(obj);
});
Die Ausgabe deiner log()-Befehle findest du in der Mod-Ausgabekonsole, die sich auf der Seite „Mod-Skript-Einstellungen“ deiner Kampagne befindet.
Nur Mod-Skript-Sandkasten v1.5. Wenn möglich, enthalten Fehlermeldungen ein Kontextobjekt, damit du sehen kannst, welches Roll20-Objekt beteiligt war (type und id):
ERROR: toBelow() muss mit einem Roll20-Grafik-, Text- oder Pfadobjekt aufgerufen werden. Aufgerufen mit [Roll20 Charakter -NM0tVij02hIfnoTdihc].
Fehlersperren
Der Sandkasten behebt kleine Fehler in deinem Skript automatisch, indem er das Skript bei Bedarf neu startet. Wenn es jedoch einen schwerwiegenden Fehler feststellt, den es nicht beheben kann, wird es – anstatt dein Skript einfach immer wieder neu zu starten, nur damit es weiterhin Fehler auslöst – eine „Fehlersperre“ für deine Kampagne aktivieren, wodurch deine Mod-Skripte erst dann wieder ausgeführt werden, wenn der Fehler behoben ist. Wenn deine Skripte wegen eines Fehlers gesperrt wurden, wird dir auf der Seite „Mod-Skript-Einstellungen“ eine Meldung wie diese angezeigt:
Mach dir keine Sorgen! Nimm einfach Änderungen an deinen Skripten vor, um das Problem zu beheben, und klicke dann auf den „Skript speichern“-Knopf. Wenn du das tust, wird die Fehlersperre aufgehoben und der Sandkasten versucht erneut, deine Skripte auszuführen. Wenn ein weiterer Fehler auftritt, wird die Fehlersperre wieder aktiviert. Du kannst diesen Vorgang so oft wiederholen, wie nötig, um den Fehler zu beheben; es wird dir niemals untersagt, deine Fehlersperren aufzuheben, nur weil du zu oft gescheitert bist.
Skriptspezifischer Aufrufstapel
Aufrufstapel zeigen Skriptnamen und Zeilennummern an.
Fehler enthalten einen umgeschriebenen Aufrufstapel, der das Skript und die Zeile nennt, nicht die verkettete Sandkasten-Datei. Manuelle Skripte werden mit SCRIPT gekennzeichnet, gefolgt von dem Namen, den du der Registerkarte gegeben hast, der Registerkartennummer, der Zeile, in der der Fehler aufgetreten ist, und dem Spaltenversatz:
| Teil | Beispiel |
|---|---|
| Bezeichnung | SCRIPT |
| Name | Bad Actor Script |
| Registerkarte | 85 |
| Linie | 3 |
| Spalte | 13 |
Beispiel: SCRIPT: Bad Actor Script [Tab 85]:3
Ein-Klick-Bibliotheksskripte sind genauso, nur dass die Bezeichnung 1-CLICK lautet:
Der gesamte Aufrufstapel wird übersetzt, sodass du, wenn du mehrere Skripte hast, die andere Skripte aufrufen, genau erkennen kannst, wo all das passiert.
Mögliche Endlosschleife erkannt – Weitere Details
Wenn der Sandkasten keine Heartbeats mehr sendet, fährt er mit einem Hinweis auf eine mögliche Endlosschleife herunter. Du siehst dann das Ereignis und wo der Callback, der gerade ausgeführt wurde, registriert wurde. Das hilft enorm dabei, herauszufinden, wo ein Problem auftritt, und sollte die Suche nach Lösungen erheblich beschleunigen.
- Ereignis:
change:graphic - Callback: in Zeile 37 im „Bad Actor Script“
Häufige Fehler
Im Folgenden findest du einige weitere häufig auftretende Fehler:
myvar ist nicht definiert
on("ready", function() {
var myVar;
log(myvar);
});
Die Fehlermeldung lautet zwar „nicht definiert“, tatsächlich ist die Variable jedoch nicht deklariert. Eine der häufigsten Ursachen hierfür ist ein Tippfehler im Namen einer deiner Variablen, beispielsweise das Fehlen eines Großbuchstabens.
Die Eigenschaft myProperty kann nicht gelesen werden oder die Methode myMethod kann nicht aufgerufen werden
on("ready", function() {
var myVar;
log(myVar.myProperty);
log(myVar.myMethod());
});
myVar ist nicht definiert, daher weiß das Skript nicht, wie es damit umgehen soll, dass du versuchst, auf eine Eigenschaft von myVar zuzugreifen. Das liegt wahrscheinlich an einem der folgenden Gründe:
- Du hast versucht, mit
getObjoderfindObjsein Objekt zu finden, aber das Ergebnis warundefined. Führe eine Fehlerprüfung durch, um sicherzustellen, dass deine Variable definiert ist, bevor du auf ihre Eigenschaften zugreifst. - Deine Variable wird bedingt definiert (mit einer Reihe von
if-Anweisungen oder etwas Ähnlichem), und keine deiner Bedingungen traf zu, sodass deine Variable zwar deklariert war, aber nie definiert wurde. Stelle sicher, dass du Bedingungen für alle Möglichkeiten hast, oder lege eine Standardoption fest oder führe eine Fehlerprüfung durch, um sicherzustellen, dass deine Variable definiert ist, bevor du auf ihre Eigenschaften zugreifst.
Roll20-Objekte benötigen ebenfalls get- und set-Methoden. obj.left ist nicht die Position auf dem Spieltisch; verwende stattdessen obj.get("left").
Unerwartetes Token
Entweder fehlt dir ein Zeichen oder du hast ein Zeichen zu viel. Dies kann darauf zurückzuführen sein, dass ein Komma zwischen einer Liste von Eigenschaften in einem Objekt oder Elementen in einem Array vergessen wurde oder dass am Ende eines komplizierten verschachtelten Methodenaufrufs eine zu viele oder zu wenige schließende Klammer steht.
_displayname gibt undefined zurück, während get("_displayname") einen Namen zurückgibt
Auf die meisten Eigenschaften von Roll20-Objekten muss über die Methoden get() und set() zugegriffen werden. Wenn du get() verwendest, kannst du bei schreibgeschützten Eigenschaften den führenden Unterstrich weglassen: obj.get("displayname") entspricht obj.get("_displayname"). obj._displayname ist es nicht.
Falls du immer noch Probleme hast, kannst du gerne einen Beitrag in unserem Mod-Skripte-Forum erstellen. Gib den Konsolenfehlertext und eine kurze Beschreibung dessen an, was du erwartet hast.