Lua 错误处理
错误处理非常关键,因为现实世界的操作通常需要使用复杂的操作,包括文件操作、数据库事务和 Web 服务调用。
在任何编程中,总是需要处理错误。 错误可以有两种类型,包括,
- 语法错误
- 运行时错误
语法错误
语法错误是由于对各种程序组件(如运算符和表达式)的不当使用而发生的。 下面显示了一个简单的语法错误示例。
a == 2
如我们所知,使用单“等于”和双“等于”是有区别的。 使用其中一个代替另一个可能会导致错误。 一个“等于”是指赋值,而两个“等于”是指比较。 类似地,我们有表达式和函数具有其预定义的实现方式。
语法错误的另一个示例如下所示
for a= 1,10
print(a)
end
当我们运行上述程序时,我们将得到以下输出
语法错误比运行时错误更容易处理,因为 Lua 解释器比运行时错误更清楚地定位错误。 从上面的错误我们可以很容易地知道,根据 Lua 结构,在 print 语句之前添加一个 do 语句是必需的。
运行时错误
如果出现运行时错误,程序可以成功执行,但可能由于输入错误或函数处理不当而导致运行时错误。 下面显示了一个显示运行时错误的简单示例。
function add(a,b)
return a+b
end
add(10)
当我们构建程序时,它将成功构建并运行。 一旦运行,显示运行时错误。
这是一个运行时错误,由于未传递两个变量而发生。 b 参数是预期的,这里它是 nil 并产生错误。
断言和错误函数
为了处理错误,我们经常使用两个函数——断言和错误。 一个简单的例子如下所示。
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)
当我们运行上面的程序时,我们会得到如下的错误输出。
error(message [, level])
终止最后调用的受保护函数并返回 message 作为错误消息。 此函数错误永远不会返回。 通常,error 在消息的开头添加一些关于错误位置的信息。 level 参数指定如何获取错误位置。 对于级别 1(默认),错误位置是调用错误函数的位置。 级别 2 将错误指向调用错误的函数的位置; 等等。 传递 0 级可避免将错误位置信息添加到消息中。
pcall 和 xpcall
在 Lua 编程中,为了避免抛出这些错误和处理错误,我们需要使用函数 pcall
或 xpcall
。
pcall (f, arg1, ...)
函数在保护模式下调用请求的函数。 如果函数 f 发生错误,它不会抛出错误。 它只是返回错误状态。 下面显示了一个使用 pcall 的简单示例。
function myfunction () n = n/nil end if pcall(myfunction) then print("Success") else print("Failure") end
上述代码运行结果如下
Failure
xpcall (f, err)
函数调用请求的函数并设置错误处理程序。 f 内的任何错误都不会传播; 相反,xpcall 捕获错误,使用原始错误对象调用 err 函数,并返回状态码。
xpcall 的一个简单示例如下所示。
function myfunction () n = n/nil end function myerrorhandler( err ) print( "ERROR:", err ) end status = xpcall( myfunction, myerrorhandler ) print( status)
上述代码运行结果如下
作为程序员,确保在编写的程序中正确处理错误是最重要的。 使用错误处理可以确保在不打扰程序用户的情况下处理超出边界条件的意外情况。