#Warn [v1.0.95.00+]

Aktiviert oder deaktiviert bestimmte Warnungen, die auf mögliche Fehler vonseiten des Programmierers hinweisen, wie z. B. Schreibfehler oder fehlende "globale" Deklarationen.

#Warn WarnungTyp, WarnungModus

Parameter

WarnungTyp

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: Zeigt vor dem Ausführen des Skripts eine Warnung an, 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+]: Zeigt vor dem Ausführen des Skripts eine Warnung an, 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.

Unreachable [v1.1.33+]: Zeigt vor dem Ausführen des Skripts eine Warnung an, wenn unmittelbar nach einem Return, Break, Continue, Throw, Goto oder Exit eine Zeile auf gleicher Verschachtelungsebene erfolgt, es sei denn, diese Zeile ist das Ziel eines Labels. Damit wird zwar nicht der gesamte unerreichbare Code erkannt, aber zumindest häufig auftretende Fehler wie z. B.:

Wenn der Code nicht erreichbar sein soll - z. B. wenn ein return verwendet wurde, um einen Codeblock vorübergehend zu deaktivieren, oder wenn ein Hotkey oder Hotstring durch Auskommentieren vorübergehend deaktiviert wurde - sollten Sie in Erwägung ziehen, den nicht erreichbaren Code ebenfalls auszukommentieren. Sie können die Warnung auch unterdrücken, indem Sie ein Label über der ersten nicht erreichbaren Zeile definieren.

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

WarnungModus

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 WarnungTyp.

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.

Lokale und globale Variablen

Beispiele

Deaktiviert alle Warnungen. Das ist der Standardzustand.

#Warn All, Off

Aktiviert alle Warnungstypen und zeigt alle Warnungen in einem Mitteilungsfenster an.

#Warn

Warnt, wenn eine lokale Variable verwendet wird, bevor sie gesetzt wurde, und sendet alle Warnungen zum OutputDebug.

#Warn UseUnsetLocal, OutputDebug