Lua 错误处理学习笔记
1. 异常的概念
在 Lua 中,如果程序出现了不可预知或者不可避免的错误,那么就会抛出一个异常。这个异常会中断当前程序执行的流程,向上层调用栈中寻找第一个能够处理该异常的函数。
2. 错误类型
在 Lua 中,有两种主要的错误类型:
2.1 错误型态 (error)
当程序出现没有办法处理的错误时,可以使用 error
函数抛出一个错误型态的异常。error
函数接受一个字符串作为参数,这个字符串会成为异常信息的一部分。
luaCopy Codeif x < 0 then
error("x 不能小于 0")
end
2.2 断言型态 (assert)
当程序出现可以预料到的错误时,可以使用 assert
函数抛出一个断言型态的异常。assert
函数接受一个表达式和一个字符串作为参数。如果表达式为 false
,那么 assert
函数就会抛出一个异常,并将第二个参数的值作为异常信息的一部分。
luaCopy Codeassert(x > 0, "x 必须大于 0")
3. 处理异常
在 Lua 中,可以使用 pcall
函数来捕获并处理异常。pcall
函数接受一个函数作为参数,并在这个函数中调用可能会出现异常的操作。如果这个函数没有异常发生,pcall
函数的返回值为 true
和被调用函数的返回值;否则,返回值为 false
和异常信息。
luaCopy Codelocal status, result = pcall(function()
-- 可能会抛出异常的操作
end)
if not status then
print("出现异常:" .. result)
end
4. 实例
4.1 错误型态实例
luaCopy Codefunction divide(x, y)
if y == 0 then
error("y 不能为 0")
end
return x / y
end
local status, result = pcall(function()
local z = divide(10, 0)
end)
if not status then
print("出现异常:" .. result)
end
执行结果:
Copy Code出现异常:[string "function divide(x, y)..."]:2: y 不能为 0
4.2 断言型态实例
luaCopy Codefunction factorial(n)
assert(type(n) == "number", "n 必须是一个数字")
if n == 0 then
return 1
else
return n * factorial(n - 1)
end
end
local status, result = pcall(function()
local f = factorial("abc")
end)
if not status then
print("出现异常:" .. result)
end
执行结果:
Copy Code出现异常:[string "function factorial(n)..."]:2: n 必须是一个数字