#Warn [v1.0.95.00+]

Aktiviert oder deaktiviert Warnungen, die angezeigt werden, wenn Fehler wie Schreibfehler oder fehlende "globale" Deklarationen erkannt wurden.

#Warn Warnungstyp, Warnungsmodus

Parameter

Warnungstyp

Die Art der Warnung, die aktiviert oder deaktiviert werden soll. Lässt man diesen Parameter weg, wird standardmäßig All verwendet.

UseUnsetLocal oder UseUnsetGlobal: Warnt, wenn eine Variable gelesen wird, die vorher weder einen Wert zugewiesen bekommen hat noch via VarSetCapacity() initialisiert wurde. Wenn die Variable absichtlich leer sein soll, weisen Sie ihr eine leere Zeichenkette zu, um diese Warnung zu unterdrücken.

Dieser Warnungstyp behandelt lokale und globale Variablen getrennt voneinander, da es eher unüblich ist, globale Variablen wegen ihrer persistenten und skriptweiten Art vorab zu initialisieren. Auf diese Weise wird die Möglichkeit bereitgestellt, diesen Warnungstyp für lokalen Variablen zu aktivieren und für globale Variablen zu deaktivieren.

#Warn
;y := ""  ; Dies würde die Warnung unterdrücken.
x := y    ; y hat keinen Wert zugewiesen bekommen.

UseEnv: Warnt, wenn AutoHotkey automatisch entscheidet, eine Umgebungsvariable statt einer leeren Skriptvariable zu verwenden. Dies tritt manchmal auf, wenn der Name einer Umgebungsvariable zufälligerweise mit dem Namen einer Skriptvariable übereinstimmt. Diese Warnung erscheint, wenn ein Zugriff auf so eine Variable erfolgt, aber nicht, wenn #NoEnv im Skript angegeben ist (aus mehreren Gründen empfohlen).

#Warn
;#NoEnv             ; Fügen Sie diese Zeile hinzu, wenn "temp" keine Umgebungsvariable sein soll.
;EnvGet temp, TEMP  ; Diese Zeile würde den Wert der Umgebungsvariable in eine Skriptvariable kopieren.
temp := ""          ; Trotz dieser Zeile scheint temp immer noch einen Wert zu haben.
MsgBox % temp       ; Diese Zeile greift auf die Umgebungsvariable "TEMP" zu.

LocalSameAsGlobal: Warnt vor dem Ausführen des Skripts, wenn undeklarierte lokale Variablen den gleichen Namen haben wie globale Variablen. Diese Warnung soll Fehler vermeiden, die auftreten können, wenn vergessen wurde, eine globale Variable innerhalb einer Funktion vor dem Zugriffsversuch zu deklarieren. Wenn die globale Variable tatsächlich lokal sein soll, kann die Warnung mit einer Deklaration wie local x oder static y unterdrückt werden. Diese Warnung wird niemals für Variablen angezeigt, die sich innerhalb einer Force-Local-Funktion befinden.

#Warn
g := 1
ShowG() {       ; Die Warnung wird sogar angezeigt, wenn die Funktion nicht aufgerufen wird.
    ;global g   ; <-- Dies ist erforderlich, um auf die globale Variable zuzugreifen.
    MsgBox % g  ; Ohne Deklaration ist "g" eine leere lokale Variable.
}

ClassOverwrite [v1.1.27+]: Warnt vor dem Ausführen des Skripts, wenn Zuweisungen auf eine Klassenvariable angewendet werden. Zum Beispiel wird box := new Box eine Warnung anzeigen, wenn Box eine Klasse ist, da dies die Klasse überschreiben würde (die als superglobal definierte Box-Variable). Warnungen werden auch für Ausgabevariablen von Befehlen angezeigt, nicht aber für ByRef-Parameter. Für verschachtelte Klassen oder dynamische Variablenreferenzen werden keine Warnungen angezeigt.

All: Wendet den angegebenen Warnungsmodus auf alle unterstützten Warnungstypen an.

Warnungsmodus

Ein Wert, der angibt, wie Warnungen übermittelt werden sollen. Lässt man diesen Parameter weg, wird standardmäßig MsgBox verwendet.

MsgBox: Zeigt ein Mitteilungsfenster an, das die Warnung beschreibt. Beachten Sie, dass, sobald das Fenster geschlossen wird, das Skript wie gewohnt weiterläuft.

StdOut [v1.1.04+]: Sendet eine Beschreibung der Warnung zur Standardausgabe (stdout), inklusive Dateiname und Zeilennummer. So können umfangreiche Texteditoren wie SciTE die Warnungen abfangen, ohne das Skript zu unterbrechen - der Benutzer kann später den Ausgabebereich des Texteditors nutzen, um auf eine fehlerhafte Zeile zu springen.

OutputDebug: Sendet eine Beschreibung der Warnung zum Debugger, um sie anzuzeigen. Wenn kein Debugger aktiv ist, hat dieser Modus keine Auswirkung. Weitere Details finden Sie unter OutputDebug.

Off: Deaktiviert alle Warnungen für den angegebenen Warnungstyp.

Bemerkungen

Standardmäßig sind alle Warnungen deaktiviert.

Warnungen können weder aktiviert noch deaktiviert werden, während das Skript läuft; die Einstellungen werden beim Laden des Skripts festgelegt. Folglich ist die Position der Direktive innerhalb des Skripts ohne Bedeutung (und kann wie alle anderen Direktiven nicht bedingt ausgeführt werden).

Die Anordnung der #Warn-Direktiven ist allerdings entscheidend: die letzte Direktive, die eine bestimmte Warnung setzt, bestimmt den Modus dieser Warnung. Die zwei unteren Anweisungen beispielsweise haben den kombinierten Effekt, dass alle Warnungen außer UseEnv aktiviert werden:

#Warn All
#Warn UseEnv, Off

EnvSet EnvVar, 1
x := EnvVar       ; Okay, da #NoEnv nicht verwendet wurde.
x := NotAnEnvVar  ; Warnung.

Siehe auch

Lokale und globale Variablen

Beispiele

#1

#Warn All, Off                    ; Deaktiviert alle Warnungen.  Das ist der voreingestellte Zustand.
#Warn                             ; Aktiviert alle Warnungstypen; zeigt alle Warnungen in einem Mitteilungsfenster an.
#Warn UseUnsetLocal, OutputDebug  ; Warnt bei einer leeren lokalen Variable; sendet Warnung zum OutputDebug.