错误处理非常关键,因为实际操作通常需要使用复杂的操作,包括文件操作,数据库事务和Web服务调用。
在任何编程中,始终需要进行错误处理。错误可以分为两种类型,包括:
语法错误是由于不正确使用各种程序组件(如,运算符和表达式)而引起的。下面显示了一个语法错误的简单示例。
a == 2
如您所知,使用单个"="和双重"=="之间是有区别的。使用一个而不是另一个会导致错误。一个"="指代赋值,而一个双重"=="指比较。
语法错误的另一个如下所示-
for a= 1,10 print(a) end
当运行上面的程序时,将获得以下输出-
lua: test2.lua:2: 'do' expected near 'print'
语法错误比运行时错误容易处理,因为与运行时错误相比,Lua解释器可以更清晰地定位错误。从上面的错误中,可以很容易地知道,根据Lua结构,在print语句之前需要添加 do 语句。
如果发生运行时错误,程序将成功执行,但由于输入错误或函数处理错误,可能导致运行时错误。下面显示一个显示运行时错误的简单示例。
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]: ?
这是一个运行时错误,由于未传递两个变量而发生。 b 参数是预期的,此处为nil并产生错误。
为了处理错误,经常使用两个函数- 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: test2.lua:3: b is not a number stack traceback: [C]: in function 'assert' test2.lua:3: in function 'add' test2.lua:6: in main chunk [C]: ?
error(message,[,level])终止上次调用的受保护函数,并将消息作为错误消息返回。 level参数指定如何获取错误位置。在级别1(默认值)下,错误位置是调用错误函数的位置。级别2将错误指向调用错误的函数所在的位置。传递级别0可以避免将错误位置信息添加到消息中。
在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)函数调用所请求的函数,并设置错误处理程序。xpcall捕获错误,使用原始错误对象调用err函数,并返回状态代码。
xpcall的一个简单如下所示。
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
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)