Latest web development tutorials

Lua Obsługa błędów

Program obchodzenie uruchomić błąd jest to konieczne, w naszej operacji na plikach, transmisji danych i usług internetowych wywołaniu pojawi się w nieoczekiwanych błędów. Jeśli nie zwracać uwagę, aby radzić sobie z komunikatów o błędach, zgodnie z informacjami będzie przeciekać, nie można uruchomić i tak dalej.

Wszelkie języków programowania, wymagana jest obsługa błędów. rodzaje błędów są następujące:

  • błąd składni
  • Runtime Error

błąd składni

Błędy składniowe są zazwyczaj spowodowane komponentów programu (takich jak operatorzy, wyrażeń) powstałe w wyniku niewłaściwego użytkowania. Prostym przykładem jest, co następuje:

-- test.lua 文件
a == 2

Powyższy kod jest wykonywany w wyniku:

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

Jak widać, nie było więcej niż błąd składni, a "=" znak, a następnie przez dwa Znak "=" jest inna. A "=" jest wyrazem przypisanie dwóch "=" jest operacja porównania.

Inny przykład:

for a= 1,10
   print(a)
end

Powyższy program pojawi się następujące błędy:

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

Błędy składniowe jest łatwiejsze niż prowadzenie błąd programu, należy uruchomić błąd w stanie zlokalizować konkretne błędy gramatyczne błędy, które można szybko rozwiązać, jak w powyższych przykładach, o ile robimy w pętli for można dodać:

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

Runtime Error

Uruchom program może wykonać błędu jest normalne, ale to wyświetli komunikat o błędzie. Poniższe przykłady, ponieważ parametry wejściowe błędów, błąd wykonania programu:

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

add(10)

Kiedy skompilować i uruchomić następujący kod, kompilator może być skuteczne, ale w czasie wykonywania spowoduje następujący błąd:

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

Poniższy komunikat o błędzie jest spowodowane tym, że program nie posiada parametr B.


Obsługa błędów

Możemy korzystać z dwóch funkcji: assert i błędów do obsługi błędów. Przykłady są następujące:

local function add(a,b)
   assert(type(a) == "number", "a 不是一个数字")
   assert(type(b) == "number", "b 不是一个数字")
   return a+b
end
add(10)

Powyższy program pojawi się następujące błędy:

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 ?

Przykład dochodzić najpierw sprawdza pierwszy argument, jeśli nie ma problemu, twierdzą, nic nie robi, inaczej drugi argument, jak dochodzić komunikat rzucona.

erf

Składnia:

error (message [, level])

: Kończy funkcji jest wykonywany, i zwraca zawartość wiadomości jako komunikat o błędzie (funkcja błędu nigdy nie wróci)

Zazwyczaj błąd będzie kilka dodatkowych informacji o błędzie do położenia głowicy.

Parametr Poziom wskazuje pozycję, aby uzyskać źle:

  • Poziom = 1 [domyślnie]: Aby wywołać błąd (plik + numer linii)
  • Poziom = 2: Funkcja, która wywołuje funkcję błędu wskazanego
  • Poziom = 0: nie dodawać lokalizację błędu

PCALL i xpcall, debugowanie

obsługa błędów Lua, można użyć funkcji (PCALL zabezpieczone połączenia), aby owinąć kod wykonywany.

PCALL otrzymaniu funkcję i chcesz przekazać parametr ten ostatni i stracony, wynik: wystąpił błąd, nie ma błędów lub zwracana wartość true lub false, ErrorInfo.

Składnia jest następująca

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

Prosty przykład:

> =pcall(function(i) print(i) end, 33)
33
true
   
> =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 w "trybie chronionym", aby wywołać pierwszy argument, więc PCALL Funkcja przechwytywania może wykonywać żadnych błędów.

Zazwyczaj, gdy wystąpi błąd, to ma nadzieję, że do końca się z większą ilością informacji debugowania, a nie tylko w którym wystąpił błąd. Ale PCALL powraca, to zniszczył część treści wezwania Zhan.

Lua zapewnia xpcall funkcji xpcall odbiera drugi parametr - procedurę obsługi błędu, gdy wystąpi błąd, Lua obsługi błędów zostanie wywołana przed wywołaniem Zhan pokaz, aby zobaczyć (odpoczynek), a następnie można użyć tej funkcji w bibliotece debugowania w celu uzyskania dodatkowych informacji o błędzie.

Biblioteka posiada dwa debug rodzajowe obsługi błędu:

  • debug.debug: Lua zapewnić zachęty, dzięki czemu użytkownicy mogą rozprzestrzeniać się z niewłaściwych powodów
  • debug.traceback: Według Zhan wezwanie do budowania rozszerzony komunikat o błędzie
> = Xpcall (function (i) print (i) błąd ( "błąd .. ') end, function () print (debug.traceback ()) end, 33) 33 stosu traceback: stdin: 1: funkcja [C]: funkcja "błędu" stdin: 1: funkcja [C]: funkcja "xpcall 'stdin: 1: w głównym fragmencie [C] :? fałszywie zera

xpcall Przykład 2:

function myfunction ()
   n = n/nil
end

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

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

Powyższy program pojawi się następujące błędy:

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