Lua - 错误处理

需要进行错误处理

错误处理非常关键,因为实际操作通常需要使用复杂的操作,包括文件操作,数据库事务和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并产生错误.

断言和错误函数

按顺序为了处理错误,我们经常使用两个函数 :  断言错误.一个简单的例子如下所示.

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]: ?

错误(消息[,级别])终止最后一个被调用的受保护函数,并返回消息作为错误消息.此函数错误永远不会返回.通常,错误会在消息开头添加有关错误位置的一些信息. 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)

当我们运行上述程序时,我们将获得以下输出.

ERROR:	test2.lua:2: attempt to perform arithmetic on global 'n' (a nil value)
false

作为程序员,它最多确保您在编写的程序中处理正确的错误处理非常重要.使用错误处理可以确保处理超出边界条件的意外条件而不会打扰程序的用户.