Lua 错误处理学习笔记

1. 异常的概念

在 Lua 中,如果程序出现了不可预知或者不可避免的错误,那么就会抛出一个异常。这个异常会中断当前程序执行的流程,向上层调用栈中寻找第一个能够处理该异常的函数。

2. 错误类型

在 Lua 中,有两种主要的错误类型:

2.1 错误型态 (error)

当程序出现没有办法处理的错误时,可以使用 error 函数抛出一个错误型态的异常。error 函数接受一个字符串作为参数,这个字符串会成为异常信息的一部分。

luaCopy Code
if x < 0 then error("x 不能小于 0") end

2.2 断言型态 (assert)

当程序出现可以预料到的错误时,可以使用 assert 函数抛出一个断言型态的异常。assert 函数接受一个表达式和一个字符串作为参数。如果表达式为 false,那么 assert 函数就会抛出一个异常,并将第二个参数的值作为异常信息的一部分。

luaCopy Code
assert(x > 0, "x 必须大于 0")

3. 处理异常

在 Lua 中,可以使用 pcall 函数来捕获并处理异常。pcall 函数接受一个函数作为参数,并在这个函数中调用可能会出现异常的操作。如果这个函数没有异常发生,pcall 函数的返回值为 true 和被调用函数的返回值;否则,返回值为 false 和异常信息。

luaCopy Code
local status, result = pcall(function() -- 可能会抛出异常的操作 end) if not status then print("出现异常:" .. result) end

4. 实例

4.1 错误型态实例

luaCopy Code
function 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 Code
function 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 必须是一个数字