Skyrim:Format eines Laufzeit-Fehlers

Aus Skript-Wiki
Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

Format eines Laufzeit-Fehlers

Ein Papyrus Laufzeit-Fehler ist in etwa so strukturiert wie im Folgenden:

(Error/Warning): <error text>
stack:
  <stack trace>

Der Fehlertext könnte einer von mehreren Fehlern sein, von denen die gebräuchlichsten mit Erklärung unten aufgelistet sind. Der Text wird gefolgt von einer Stack-Spur (stack trace), was im Wesentlichen eine Liste mit Funktionen ist, deren Aufruf (wo) zu einem Fehler führte.


Warnung versus Fehler

Eine Warnung ist ein Zustand, den das Spiel entdeckt, der vermutlich nicht das ist, was der Scriptschreiber beabsichtigt hat, was aber kein aktueller Fehler ist. Ein Fehler ist etwas, das eine saubere Ausführung eines Scripts verhindert und etwas ist, das der Scriptschreiber korrigieren sollte.


Stack Traces

Stack-Spuren zeigen hauptsächlich auf einen Ort im Script und die aufgerufenen Funktionen in Reihenfolge, um diesen Ort zu erhalten. Sie haben folgendes Format:

<Function A> - "<script file A>" Line A
<Function B> - "<script file B>" Line B
<Function C> - "<script file C>" Line C

In der obigen Vereinfachung ist Funktion C die Funktion oder das Event, was vom Spiel aufgerufen wurden. Diese Funktion ruft in der Scriptdatei C in Zeile C die Funktion B auf. Funktion B ruft dann Funktion A auf und in Funktion A im Script A in Zeile A ist ein Fehler aufgetreten. Ist eine dieser Funktionen eine Native-Funktion, wird die Scriptdatei als "<native>" angezeigt und die Zeilennummer als Fragezeichen.

Wenn die Debug-Information nicht geladen ist (Anstellen der Debug-Information), sind alle Zeilennummern Fragezeichen


Beispiele

[AMBDustDropDebris (0001E68C)].Sound.Play() - "<native>" Line ?
[FXdustDropRandomACT (000621D5)].fxDustDropRandomSCRIPT.OnLoad() - "fxDustDropRandomSCRIPT.psc" Line 25

In der obigen Stack-Spur wurde ein Fehler innerhalb der Funktion Sound.Play() gemeldet, die von der Form AMBDustDropDebris (0001E68C) aufgerufen wurde. Weil die Funktion native ist, wird der Dateiname als "<native>" angezeigt und die Zeilennummer ist "?". Diese Funktion wurde von fxDustDropRandomSCRIPT.OnLoad() aufgerufen. Das ist nun, da es am Ende der Stack-Spur steht, das Event, was vom Spiel direkt aufgerufen wurde. Die Funktion befindet sich in der "fxDustDropRandomSCRIPT.psc"-Datei und der Aufruf von Play befindet sich in Zeile 25.


Übliche Warnungen

Es folgen übliche allgemeine Laufzeit-Warnungen mit einer wesentlichen Erklärung bezüglich ihrer Verursachung und möglicher Lösungen. Besondere Warnungen, die zu bestimmten Funktionen gehören, sind hier nicht aufgeführt.


"X does not have a property named Y, property skipped."

Diese Warnung erscheint wenn eine Instanz des Scripts X initialisiert ist und die Masterdatei oder das Plugin einen Wert für Property Y bereit stellt, diese Property jedoch nicht existiert. Das zeigt üblicherweise an, dass ein Script geändert wurde und nun mit dem Plugin nicht mehr aktuell ist. Die Behebung ist einfach. Es ist das Property-Fenster für das fragliche Script zu öffnen und ein OK für das „auto-fixed data“ zu geben.


"Property Y on object X is read-only, property skipped."

Diese Warnung erscheint wenn eine Instanz des Scripts X initialisiert ist und die Masterdatei oder das Plugin einen Wert für Property Y bereit stellt, diese Property jedoch als read-only geflaggt ist (es hat keine set-Funktion). Das zeigt üblicherweise an, dass ein Script geändert wurde und nun mit dem Plugin nicht mehr aktuell ist. Die Behebung ist einfach. Es ist das Property-Fenster für das fragliche Script zu öffnen und ein OK für das „auto-fixed data“ zu geben.


"The type of property Y on object X does not match the passed-in type at creation, property skipped."

Diese Warnung erscheint wenn eine Instanz des Scripts X initialisiert ist und die Masterdatei oder das Plugin einen Wert für Property Y bereit stellt, der Typ des Plugins oder der Masterdatei nicht mit dem Typ der Property übereinstimmt. Das zeigt üblicherweise an, dass ein Script geändert wurde und nun mit dem Plugin nicht mehr aktuell ist. Die Behebung ist einfach. Es ist das Property-Fenster für das fragliche Script zu öffnen und sicherzustellen, dass die Property auf einen gültigen Wert gesetzt ist.


"Function X.Y.Z in stack frame A in stack B differs from the in-game resource files - using version from save"

Diese Warnung kann beim Laden des Savegames angezeigt werden. Es zeigt an, dass Funktion X im State Y im Script Z zum Zeitpunkt des Saves lief, aber nach der Erstellung des Saves geändert wurde. Das Spiel wird die alte Version der Funktion im Save nutzen, bis sie existiert.


"Function X.Y.Z in stack frame A in stack B doesn't exist in the in-game resource files - using version from save"

Diese Warnung kann beim Laden des Savegames ausgeworfen werden. Das zeigt an, dass Funktion X im State Y im Script Z nicht länger in diesem Script auf dem Speicher existiert, das Spiel jedoch mitten in der dieser Funktion war, also das Save gemacht wurde. Deshalb wird das Spiel die im Save aufgezeichnete Version der Funktion nutzen, bis sie existiert.


"Unable to get type X referenced by the save game. Objects of this type will not be loaded."

Diese Warnung wird beim Laden des Savegames gezeigt und zeigt an, dass einige Objekte oder Typ X gesichert wurden, Script X jedoch nicht länger existiert (oder nicht geladen werden konnte)


"Type of variable X on script Y, which is Z, doesn't match the type loaded in the actual object. This variable will be skipped."

Eine andere Warnung, die beim Laden des Savegames gezeigt wird. Sie bedeutet, dass der Typ der Variablen X sich zwischen dem Erstellen des Saves und dem Laden des Saves geändert hat. Jeder gespeicherte Wert wird beim Laden verworfen.


"Variable X on script Y loaded from save not found within the actual object. This variable will be skipped."

Diese Warnung wird beim Laden des Savegames gezeigt, wenn die Variable X im Save nicht länger im compilierten Script Y existiert. Der Wert der Variablen wird beim Laden verworfen.


Übliche Fehler

Es folgen übliche allgemeine Laufzeit-Fehler mit einer wesentlichen Erklärung bezüglich ihrer Verursachung und möglicher Lösungen. Besondere Fehler, die zu bestimmten Funktionen gehören, sind hier nicht aufgeführt.


"Cannot call X() on a None object, aborting function call"

Dieser Fehler tritt auf, wenn eine Funktion X, die nicht-global ist, auf ein Objekt oder eine Objektvariable aufgerufen wird, das None ist. Da man eine nicht-globale Funktion nicht auf nichts aufrufen kann, wird dieser Aufruf ignoriert und der Fehler wird ausgegeben. Wenn von der Variablen angenommen wird, dass sie None sein kann, sollte man wohl auf None prüfen, bevor die Funktion auf sie aufgerufen wird. Andernfalls sollte man prüfen, was im Script zur der Zeit vorgeht, um festzustellen, warum diese Variable überhaupt erst None ist. Siehe Mein Script Funktioniert Nicht wegen einiger Möglichkeiten.


"Unable to call X - no native object bound to the script object, or object is of incorrect type"

Dieser Fehler erscheint, wenn die native Funktion X, die nicht-global ist, an einer Objekt-Variablen aufgerufen wird, die auf kein aktuelles Objekt im Spiel zeigt. Das passiert normalerweise in ActiveMagicEffect scripts, die ihren Effekt entzogen bekommen oder während eines Events, dass gesendet wurde nachdem das Spiel das Objekt entsorgt hat (wie OnUnload).


"Cannot open store for class X, missing file?"

Das erscheint, wenn das Spiel versucht, das geforderte Script zu laden, die Datei dafür jedoch nicht gefunden werden kann. Prüfe doppelt, dass sich die pex-Datei in dem entsprechenden Verzeichnis befindet (Data/Scripts).


"Cannot divide by zero"

Eine Division durch 0 wurde versucht, der Nenner einer Division oder Modulus-Operation darf nicht 0 sein.


"Assigning None to a non-object variable named X"

Es wurde ein Versuch gemacht, den Wert von "None" einer Variablen zuzuweisen, die diesen Wert nicht aufnehmen kann. Dies ist normalerweise das Ergebnis eines früheren gescheiterten Funktionsaufrufs einer Funktion, die eine Nichtobjekt-Variable zurück gibt, die dann versucht diesen Wert in den Rückgabewert zu stopfen Der 'wahre' Fehler ist üblicherweise direkt davor.


"Array index X is out of range (0-Y)"

Es wurde versucht, auf ein Array-Element zuzugreifen, das nicht existiert. Das Element, auf das zugegriffen werden sollte, war X, wobei der Gültigkeitsbereich der Indices von 0-y angezeigt ist. Stelle sicher, dass der Wert, der für die Indexierung des Arrays genutzt wird, aus innerhalb des Bereiches des Arrays ist.


"Cannot access an element of a None array"

Es wurde versucht, auf ein Array-Element eines Arrays zuzugreifen, das derzeit None ist. Stelle sicher, dass die Werte des Arrays validiert sind, bevor darauf zugegriffen wird.


"Overridden function X in object Y does not have the same signature as in parent object Z."

Dieser Fehler kann beim Laden eines Scripts erscheinen und zeigt an, dass die im Objekt Y definierte Funktion X nicht zu der Parent-Definition (in Parent Z) passt . Mit anderen Worten, der Rückgabe-Typ und/oder die Parameter passen nicht. Dies meint üblicherweise, dass entweder Y oder Z nicht mehr aktuell ist und neu übersetzt werden muss.


"Class X found more then once in objects derived from Y - circular inheritance isn't allowed."

Dieser Fehler kann beim Laden eines Scripts erscheinen und zeigt an, dass irgendwo in der Vererbung zwischen Script X und Y ein Zirkelschluss ist. Das meint üblicherweise, dass X, Y oder ein inneres Objekt nicht mehr aktuell ist und neu übersetzt werden muss.


Links