Lua-Fehlerbehandlung

Fehlerbehandlung während der Programmausführung ist notwendig. Bei Dateioperationen, Datenübertragungen und Aufrufen von Webdiensten können unerwartete Fehler auftreten. Wenn Fehlerinformationen nicht ordnungsgemäß behandelt werden, kann dies zu Informationslecks, Programmfehlern und anderen Problemen führen.

Jede Programmiersprache erfordert Fehlerbehandlung. Zu den Fehlertypen gehören:

  • Syntaxfehler
  • Laufzeitfehler

Syntaxfehler

Syntaxfehler werden normalerweise durch unsachgemäße Verwendung von Programmkomponenten (wie Operatoren und Ausdrücken) verursacht. Ein einfaches Beispiel sieht wie folgt aus:

-- test.lua 文件
a == 2

Das Ausführungsergebnis des obigen Codes ist:

lua: test.lua:2: syntax error near '=='

Wie Sie sehen können, ist oben ein Syntaxfehler aufgetreten; ein "="-Zeichen unterscheidet sich von zwei "="-Zeichen. Ein "=" ist ein Zuweisungsausdruck, und zwei "=" sind eine Vergleichsoperation.

Ein weiteres Beispiel:

Beispiel

for a= 1,10
   print(a)
end

Beim Ausführen des obigen Programms wird der folgende Fehler erzeugt:

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

Syntaxfehler sind einfacher als Laufzeitfehler im Programm. Laufzeitfehler können den konkreten Fehler nicht lokalisieren, aber Syntaxfehler lassen sich schnell beheben. Im obigen Beispiel müssen wir beispielsweise nur "do" unter der for-Anweisung hinzufügen:

Beispiel

for a= 1,10
do
   print(a)
end

Laufzeitfehler

Ein Laufzeitfehler liegt vor, wenn das Programm normal ausgeführt wird, aber eine Fehlermeldung ausgibt. Das folgende Beispiel meldet einen Fehler während der Ausführung aufgrund einer falschen Parametereingabe:

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

add(10)

Wenn wir den folgenden Code kompilieren und ausführen, kann die Kompilierung erfolgreich sein, aber zur Laufzeit tritt der folgende Fehler auf:

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]: ?

In Lua kann beim Aufruf einer Funktion der Aufruf auch dann erfolgreich sein, wenn die tatsächliche Parameterliste und die formale Parameterliste nicht übereinstimmen. Überzählige Parameter werden verworfen, und fehlende Parameter werden mit nil aufgefüllt.

Die obige Fehlermeldung entsteht, weil Parameter b mit nil aufgefüllt wird und nil an der +-Operation teilnimmt.

Wennaddinnerhalb der Funktion nicht"return a+b"sondern"print(a,b)"dann wird das Ergebnis"10 nil"es wird kein Fehler gemeldet.


Fehlerbehandlung

Wir können zwei Funktionen verwenden: assert und error, um Fehler zu behandeln. Beispiel wie folgt:

Beispiel

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
hinzufügen(10)

Beim Ausführen des obigen Programms wird der folgende Fehler erzeugt:

lua: test.lua:3: b 不是一个数字
stack traceback:
    [C]: in function 'assert'
    test.lua:3: in local 'add'
    test.lua:6: in main chunk
    [C]: in ?

Im Beispiel prüft assert zuerst den ersten Parameter. Wenn es kein Problem gibt, tut assert nichts; andernfalls wirft assert den zweiten Parameter als Fehlermeldung.

error-Funktion

Syntaxformat:

error (message [, level])

Funktion: beendet die aktuell ausgeführte Funktion und gibt den Inhalt von message als Fehlermeldung zurück (die error-Funktion kehrt nie zurück)

Normalerweise hängt error einige Fehlerpositionsinformationen an den Anfang der Nachricht an.

Der Parameter Level gibt an, wo die Fehlerposition ermittelt wird:

  • Level=1 [Standard]: die Position des error-Aufrufs (Datei + Zeilennummer)
  • Level=2: gibt an, welche Funktion die Funktion aufgerufen hat, die error aufruft
  • Level=0: keine Fehlerpositionsinformationen hinzufügen

pcall und xpcall, debug

Um Fehler in Lua zu behandeln, können Sie die Funktion pcall (geschützter Aufruf) verwenden, um den Code zu umschließen, der ausgeführt werden muss.

pcall empfängt eine Funktion und die an sie zu übergebenden Parameter und führt sie aus. Ausführungsergebnisse: mit Fehler, ohne Fehler; Rückgabewert true oder false, errorinfo.

Das Syntaxformat lautet wie folgt

if pcall(function_name, ….) then
-- 没有错误
else
-- 一些错误
end

Einfaches Beispiel:

Beispiel

> =pcall(function(i) print(i) end, 33)
33
wahr
   
> =pcall(function(i) print(i) error('error..') end, 33)
33
false        stdin:1: error..
> function f() return false,2 end
> if f() then print '1' else print '0' end
0

pcall ruft den ersten Parameter in einem "geschützten Modus" auf, sodass pcall jeden Fehler während der Funktionsausführung abfangen kann.

Normalerweise möchten Sie bei einem Fehler mehr Debugging-Informationen erhalten, nicht nur den Ort des Fehlers. Wenn pcall jedoch zurückkehrt, hat es bereits einen Teil des Inhalts des Aufrufstapels zerstört.

Lua stellt die Funktion xpcall bereit. xpcall empfängt einen zweiten Parameter – eine Fehlerbehandlungsfunktion. Wenn ein Fehler auftritt, ruft Lua die Fehlerbehandlungsfunktion auf, bevor der Aufrufstapel abgebaut wird, sodass Sie in dieser Funktion die debug-Bibliothek verwenden können, um zusätzliche Informationen über den Fehler zu erhalten.

Die debug-Bibliothek bietet zwei allgemeine Fehlerbehandlungsfunktionen:

  • debug.debug: bietet eine Lua-Eingabeaufforderung, damit Benutzer die Ursache des Fehlers überprüfen können
  • debug.traceback: erstellt eine erweiterte Fehlermeldung basierend auf dem Aufrufstapel
>=xpcall(function(i) print(i) error('error..') end, function() print(debug.traceback()) end, 33)
33
stack traceback:
stdin:1: in function <stdin:1>
[C]: in function 'error'
stdin:1: in function <stdin:1>
[C]: in function 'xpcall'
stdin:1: in main chunk
[C]: in ?
false        nil

xpcall-Anwendungsbeispiel 2:

Beispiel

function myfunction ()
   n = n/nil
end

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

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

Beim Ausführen des obigen Programms wird der folgende Fehler erzeugt:

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