- Lua 教程
- Lua - 首页
- Lua 基础
- Lua - 概述
- Lua - 环境
- Lua - 基本语法
- Lua - 注释
- Lua - 打印 Hello World
- Lua - 变量
- Lua - 数据类型
- Lua - 运算符
- Lua - 循环
- Lua - 决策
- Lua - 函数
- Lua - 日期和时间
- Lua 数组
- Lua - 数组
- Lua - 多维数组
- Lua - 数组长度
- Lua - 迭代数组
- Lua 迭代器
- Lua - 迭代器
- Lua 列表
- Lua - 在列表中搜索
- Lua 模块
- Lua - 模块
- Lua - 命名空间
- Lua 元表
- Lua - 元表
- Lua 协程
- Lua - 协程
- Lua 文件处理
- Lua - 文件 I/O
- Lua 库
- Lua - 标准库
- Lua - 数学库
- Lua - 操作系统功能
- Lua 有用资源
- Lua - 快速指南
- Lua - 有用资源
- Lua - 讨论
Lua - 错误处理
错误处理的必要性
错误处理非常重要,因为现实世界的操作通常需要使用复杂的操作,包括文件操作、数据库事务和 Web 服务调用。
在任何编程中,都需要进行错误处理。错误可以分为两种类型:
语法错误
运行时错误
语法错误
语法错误是由于不正确地使用各种程序组件(如运算符和表达式)造成的。下面显示了一个简单的语法错误示例。
a == 2
如你所知,“等于”和“等于等于”之间是有区别的。使用一个代替另一个会导致错误。“等于”表示赋值,“等于等于”表示比较。类似地,表达式和函数有其预定义的实现方式。
另一个语法错误示例如下:
main.lua
for a= 1,10 print(a) end
输出
运行上述程序时,我们将得到以下输出:
lua: main.lua:2: 'do' expected near 'print'
语法错误比运行时错误更容易处理,因为 Lua 解释器比运行时错误更清晰地定位错误。从上面的错误中,我们可以很容易地知道,根据 Lua 的结构,需要在 print 语句之前添加一个 do 语句。
运行时错误
对于运行时错误,程序能够成功执行,但由于输入错误或函数处理不当,可能会导致运行时错误。下面显示了一个简单的运行时错误示例。
main.lua
function add(a,b) return a+b end add(10)
输出
构建程序时,它将成功构建并运行。运行后,会显示运行时错误。
lua: main.lua:2: attempt to perform arithmetic on local 'b' (a nil value) stack traceback: main.lua:2: in function 'add' main.lua:5: in main chunk [C]: ?
这是一个运行时错误,这是由于没有传递两个变量造成的。预期参数 b 为空,因此会产生错误。
assert 和 error 函数
为了处理错误,我们经常使用两个函数:assert 和 error。下面显示了一个简单的示例。
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 add(10)
输出
运行上述程序时,我们将得到以下错误输出。
lua: main.lua:3: b is not a number stack traceback: [C]: in function 'assert' main.lua:3: in function 'add' main.lua:6: in main chunk [C]: ?
error (message [, level]) 函数终止最后一次调用的受保护函数,并返回 message 作为错误消息。此函数 error 永远不会返回。通常,error 会在消息开头添加一些关于错误位置的信息。level 参数指定如何获取错误位置。使用 level 1(默认值),错误位置是在调用 error 函数的地方。level 2 将错误指向调用 error 函数的函数的调用位置;以此类推。传递 level 0 将避免在消息中添加错误位置信息。
pcall 和 xpcall
在 Lua 编程中,为了避免抛出这些错误并处理错误,我们需要使用 pcall 或 xpcall 函数。
pcall (f, arg1, ...) 函数以保护模式调用请求的函数。如果函数 f 中发生某些错误,它不会抛出错误。它只返回错误的状态。下面显示了一个使用 pcall 的简单示例。
main.lua
function myfunction () n = n/nil end if pcall(myfunction) then print("Success") else print("Failure") end
输出
运行上述程序时,我们将得到以下输出。
Failure
xpcall (f, err) 函数调用请求的函数并设置错误处理程序。f 内部的任何错误都不会传播;相反,xpcall 会捕获错误,使用原始错误对象调用 err 函数,并返回状态代码。
下面显示了一个 xpcall 的简单示例。
main.lua
function myfunction () n = n/nil end function myerrorhandler( err ) print( "ERROR:", err ) end status = xpcall( myfunction, myerrorhandler ) print( status)
输出
运行上述程序时,我们将得到以下输出。
ERROR: main.lua:2: attempt to perform arithmetic on global 'n' (a nil value) false
作为程序员,最重要的是确保你在编写的程序中处理好错误。使用错误处理可以确保处理超出边界条件的意外情况,而不会影响程序的用户。