Lua - Fehlerbehandlung

Notwendigkeit der Fehlerbehandlung

Die Fehlerbehandlung ist sehr kritisch, da für reale Vorgänge häufig komplexe Vorgänge erforderlich sind, darunter Dateivorgänge, Datenbanktransaktionen und Webdienstaufrufe.

Bei jeder Programmierung ist immer eine Fehlerbehandlung erforderlich. Es gibt zwei Arten von Fehlern:

  • Syntaxfehler
  • Laufzeitfehler

Syntaxfehler

Syntaxfehler treten auf, wenn verschiedene Programmkomponenten wie Operatoren und Ausdrücke nicht ordnungsgemäß verwendet werden. Ein einfaches Beispiel für einen Syntaxfehler ist unten dargestellt.

a == 2

Wie Sie wissen, gibt es einen Unterschied zwischen der Verwendung eines einfachen "gleich" und eines doppelten "gleich". Die Verwendung eines anstelle des anderen kann zu einem Fehler führen. Ein "gleich" bezieht sich auf die Zuordnung, während sich ein doppeltes "gleich" auf den Vergleich bezieht. Ebenso haben wir Ausdrücke und Funktionen mit vordefinierten Implementierungsmethoden.

Ein weiteres Beispiel für einen Syntaxfehler ist unten dargestellt.

for a= 1,10
   print(a)
end

Wenn wir das obige Programm ausführen, erhalten wir die folgende Ausgabe:

lua: test2.lua:2: 'do' expected near 'print'

Syntaxfehler sind viel einfacher zu behandeln als Laufzeitfehler, da der Lua-Interpreter den Fehler klarer lokalisiert als bei Laufzeitfehlern. Aus dem obigen Fehler können wir leicht erkennen, dass das Hinzufügen einer do- Anweisung vor der print-Anweisung gemäß der Lua-Struktur erforderlich ist.

Laufzeitfehler

Bei Laufzeitfehlern wird das Programm erfolgreich ausgeführt, es kann jedoch zu Laufzeitfehlern aufgrund von Fehlern bei der Eingabe oder bei fehlerhaften Funktionen führen. Ein einfaches Beispiel zum Anzeigen eines Laufzeitfehlers ist unten dargestellt.

function add(a,b)
   return a+b
end

add(10)

Wenn wir das Programm erstellen, wird es erfolgreich erstellt und ausgeführt. Sobald es ausgeführt wird, wird ein Laufzeitfehler angezeigt.

lua: test2.lua:2: attempt to perform arithmetic on local 'b' (a nil value)
stack traceback:
	test2.lua:2: in function 'add'
	test2.lua:5: in main chunk
	[C]: ?

Dies ist ein Laufzeitfehler, der aufgetreten ist, weil zwei Variablen nicht übergeben wurden. Dasb Parameter wird erwartet und hier ist es Null und erzeugt einen Fehler.

Assert- und Fehlerfunktionen

Um Fehler zu behandeln, verwenden wir häufig zwei Funktionen - assert und error. Ein einfaches Beispiel ist unten gezeigt.

local function add(a,b)
   assert(type(a) == "number", "a is not a number")
   assert(type(b) == "number", "b is not a number")
   return a+b
end

add(10)

Wenn wir das obige Programm ausführen, erhalten wir die folgende Fehlerausgabe.

lua: test2.lua:3: b is not a number
stack traceback:
	[C]: in function 'assert'
	test2.lua:3: in function 'add'
	test2.lua:6: in main chunk
	[C]: ?

Das error (message [, level])Beendet die zuletzt aufgerufene geschützte Funktion und gibt die Nachricht als Fehlermeldung zurück. Dieser Funktionsfehler wird nie zurückgegeben. Normalerweise fügt error am Anfang der Nachricht einige Informationen zur Fehlerposition hinzu. Das Argument level gibt an, wie die Fehlerposition ermittelt wird. Bei Stufe 1 (Standardeinstellung) wurde an der Fehlerposition die Fehlerfunktion aufgerufen. Stufe 2 zeigt den Fehler an die Stelle, an der die Funktion aufgerufen wurde, die den Fehler aufgerufen hat. und so weiter. Durch das Bestehen einer Stufe 0 wird das Hinzufügen von Fehlerpositionsinformationen zur Nachricht vermieden.

pcall und xpcall

In der Lua-Programmierung müssen wir die Funktionen pcall oder xpcall verwenden, um zu vermeiden, dass diese Fehler ausgelöst und Fehler behandelt werden.

Das pcall (f, arg1, ...)Funktion ruft die angeforderte Funktion im geschützten Modus auf. Wenn in Funktion f ein Fehler auftritt, wird kein Fehler ausgegeben. Es wird nur der Fehlerstatus zurückgegeben. Ein einfaches Beispiel für die Verwendung von pcall ist unten dargestellt.

function myfunction ()
   n = n/nil
end

if pcall(myfunction) then
   print("Success")
else
	print("Failure")
end

Wenn wir das obige Programm ausführen, erhalten wir die folgende Ausgabe.

Failure

Das xpcall (f, err)Funktion ruft die angeforderte Funktion auf und setzt auch den Fehlerbehandler. Ein Fehler in f wird nicht weitergegeben. Stattdessen fängt xpcall den Fehler ab, ruft die Fehlerfunktion mit dem ursprünglichen Fehlerobjekt auf und gibt einen Statuscode zurück.

Ein einfaches Beispiel für xpcall ist unten dargestellt.

function myfunction ()
   n = n/nil
end

function myerrorhandler( err )
   print( "ERROR:", err )
end

status = xpcall( myfunction, myerrorhandler )
print( status)

Wenn wir das obige Programm ausführen, erhalten wir die folgende Ausgabe.

ERROR:	test2.lua:2: attempt to perform arithmetic on global 'n' (a nil value)
false

Als Programmierer ist es äußerst wichtig, dass Sie in den von Ihnen geschriebenen Programmen für eine ordnungsgemäße Fehlerbehandlung sorgen. Durch die Verwendung der Fehlerbehandlung kann sichergestellt werden, dass unerwartete Bedingungen außerhalb der Randbedingungen behandelt werden, ohne den Benutzer des Programms zu stören.