Lua 基础教程(十八)错误处理

Lua 基础教程(十八)错误处理

错误处理的必要性

错误处理非常重要,因为现实世界的操作通常需要使用复杂操作,包括文件操作、数据库事务和 Web 服务调用。

在任何编程中,总是有错误处理的要求。错误可以两种类型:

  • 语法错误
  • 运行时错误

语法错误

不正确使用程序组件(如运算符和表达式)会导致语法错误 。一个简单的语法错误示例如下:

a == 2

正如你所知,单个的“等于”和双重的“等于”使用方式不同。使用一个代替另一个可能导致错误。一个“等于”表示赋值,而双重的“等于”表示比较。类似地, 表达式和函数有其预定义的实现方式。

另一个语法错误的示例如下所示:

for a= 1,10
   print(a)
end

运行上面的程序时,我们会得到以下输出:

lua: test2.lua:2: 'do' expected near 'print'

与运行时错误相比,语法错误要容易处理得多,因为 Lua 解释器会更清楚地定位错误。从上面的错误中,我们很容易知道,需要在 print 语句之前添加 do 语句以符合 Lua 结构。

运行时错误

在运行时错误中,程序会成功执行,但由于输入错误或函数处理不当,可能导致运行时错误。一个简单的示例展示了运行时错误,如下所示:

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,导致错误。

断言和错误函数

为了处理错误,我们经常使用两个函数:asserterror。下面是一个简单的示例。

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]) 函数终止了上次调用的受保护函数,并将 message 作为错误消息返回。这个 error 函数永远不会返回。通常,错误会在消息的开头添加一些关于错误位置的信息。level 参数指定如何获取错误位置。在级别为 1(默认值)的情况下,错误位置是调用 error 函数的位置。级别为 2 时,错误位置是调用 error 的函数的位置;依此类推。通过传递级别 0,可以避免将错误位置信息添加到消息中。

pcallxpcall

在 Lua 编程中,为了避免抛出这些错误和处理错误,需要使用函数 pcallxpcall

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 捕获错误,用原始错误对象调用 错误处理程序 ,并返回状态码。

下面是一个使用 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

作为程序员,确保在编写的程序中适当处理错误是非常重要的。 在超出边界条件的意外情况下,确保错误得到妥善处理, 而不会干扰程序的用户。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值