#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

Wenn weggelassen, wird standardmäßig All verwendet. Andernfalls geben Sie den Typ der Warnung an, die aktiviert oder deaktiviert werden soll.

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. IsSet() kann verwendet werden, um zu prüfen, ob das Lesen einer Variable diese Warnung auslösen würde.

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. Daher ist es möglich, diesen Warnungstyp für lokale 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 anstelle einer leeren Skriptvariable zu verwenden. Dies passiert manchmal, wenn der Name einer Umgebungsvariable zufällig 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 Beginn der Skriptausführung eine Warnung an, wenn undeklarierte lokale Variablen den gleichen Namen wie globale Variablen haben. 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 auch angezeigt, wenn die Funktion nicht aufgerufen wird.
    ;global g   ; <-- Dies wird für den Zugriff auf die globale Variable benötigt.
    MsgBox % g  ; Ohne Deklaration ist "g" eine leere lokale Variable.
}

ClassOverwrite [v1.1.27+]: Zeigt vor Beginn der Skriptausführung eine Warnung an, wenn Zuweisungen auf eine Klassenvariable angewendet werden. Zum Beispiel zeigt box := new Box eine Warnung an, 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, jedoch nicht für ByRef-Parameter. Für verschachtelte Klassen oder dynamische Variablenreferenzen werden keine Warnungen angezeigt.

Unreachable [v1.1.33+]: Zeigt vor Beginn der Skriptausführung eine Warnung an, wenn unmittelbar nach einem Return, Break, Continue, Throw, Goto oder Exit eine Zeile auf gleicher Verschachtelungsebene folgt, 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 zum Beispiel:

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

Wenn weggelassen, wird standardmäßig MsgBox verwendet. Andernfalls geben Sie einen Wert an, der festlegt, wie Warnungen übermittelt werden sollen.

MsgBox: Zeigt ein Mitteilungsfenster an, das die Warnung beschreibt. Beachten Sie, dass das Skript nach dem Schließen des Mitteilungsfensters normal weiterläuft.

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

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

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

Bemerkungen

Wenn diese Direktive im Skript nicht angegeben ist, sind alle Warnungen ausgeschaltet.

Warnungen können während der Skriptausführung weder aktiviert noch deaktiviert werden; 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. Zum Beispiel haben die beiden unteren Direktiven den kombinierten Effekt, alle Warnungen außer UseEnv zu aktivieren:

#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