Latest web development tutorials

Lua Обработка ошибок

Программа обработки запуска ошибки необходимо, в нашей операции с файлами, передачи данных и веб-службы вызова будут появляться в самых неожиданных ошибок. Если вы не обратить внимание на дело с сообщениями об ошибках, в соответствии с информацией будет утечка, не может работать и так далее.

Любые языки программирования, требуется обработка ошибок. Типы ошибок являются:

  • Ошибка синтаксиса
  • Ошибка выполнения

Ошибка синтаксиса

Синтаксические ошибки, как правило, из-за компонентов программы (например, операторы, выражения), вызванные неправильным использованием. Простой пример выглядит следующим образом:

-- test.lua 文件
a == 2

Приведенный выше код выполняется в результате:

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

Как вы можете видеть, было больше, чем за синтаксической ошибки, а "=" знак следуют два знака "=" отличается. А "=" является выражение присваивания два "=" является операция сравнения.

Другой пример:

for a= 1,10
   print(a)
end

Выше программа появится следующие ошибки:

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

Ошибки синтаксиса проще, чем при запуске ошибка программы, ошибка запуска не удалось обнаружить конкретные ошибки, грамматические ошибки, которые мы можем быстро решить, например, приведенных выше примеров до тех пор, как мы делаем в заявлении для могут быть добавлены:

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

Ошибка выполнения

Запуск программы может выполнять ошибки нормально, но он выводит сообщение об ошибке. Ниже приведены примеры, так как входные параметры, ошибки, ошибки выполнения программы:

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

add(10)

Когда мы скомпилировать и запустить следующий код, компилятор может быть успешным, но во время выполнения будет производить следующее сообщение об ошибке:

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

Следующее сообщение об ошибке вызвано тем, что программа не хватает параметра Ь.


Обработка ошибок

Мы можем использовать две функции: ошибки и утверждают для обработки ошибок. Примерами могут служить следующие:

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

Выше программа появится следующие ошибки:

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 ?

Пример утверждают сначала проверяет первый аргумент, если нет проблем, утверждать ничего не делает, в противном случае, второй аргумент, чтобы утверждать сообщение об ошибке выбросили.

функция ошибок

Синтаксис:

error (message [, level])

: Завершает функцию которая выполняется, и возвращает содержимое сообщения в виде сообщения об ошибке (функция ошибки никогда не вернется)

Как правило, ошибка будет некоторая дополнительная информация о сообщении об ошибке в положении головы.

Параметр Level указывает положение, чтобы получить не так:

  • Уровень = 1 [по умолчанию]: Для вызова ошибки (файл + номер строки)
  • Level = 2: функция, которая вызывает функцию ошибки, указанную
  • Уровень = 0: не добавляйте место ошибки

PCALL и xpcall, отлаживать

Lua обработка ошибок, вы можете использовать функцию PCALL (защищенный вызов), чтобы обернуть код, который будет выполнен.

PCALL получать функцию, и вы хотите передать параметр последнего, и выполняется, результат: есть ошибка, нет ошибки, или значение, возвращаемое истинным или ложным, errorinfo.

Синтаксис выглядит следующим образом

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

Простой пример:

> =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 в "защищенном режиме", чтобы вызвать первый аргумент, поэтому PCALL функция захвата может выполнять какие-либо ошибки.

Как правило, при возникновении ошибки, она надеется, что в конечном итоге с большим количеством информации отладки, а не только там, где произошла ошибка. Но PCALL возвращается, она разрушила часть содержимого вызова Чжань.

Lua обеспечивает xpcall функцию, xpcall приема второго параметра - обработчик ошибок при возникновении ошибки, Lua обработчик ошибок будет вызываться перед вызовом Чжань шоу, чтобы увидеть (расслабиться), то вы можете использовать эту функцию в библиотеке отладки чтобы получить дополнительную информацию об ошибке.

отладки библиотека предоставляет два общих обработчика ошибок:

  • debug.debug: Lua обеспечивают подсказку, что позволяет пользователям распространять неправильные причины
  • debug.traceback: Согласно Чжань вызова построить расширенное сообщение об ошибке
> = Xpcall (функция (я) печати (я) ошибка ( 'ошибка ..') конец, функция () печати (debug.traceback)) конец (33) 33 стопка отслеживающий: STDIN: 1: в функции [C]: в функции 'ошибки' STDIN: 1: в функции [C]: в функции 'xpcall' STDIN: 1: в главном фрагменте [C] :? В ложном нолю

xpcall Пример 2:

function myfunction ()
   n = n/nil
end

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

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

Выше программа появится следующие ошибки:

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