📜  Lua-错误处理

📅  最后修改于: 2020-10-16 05:16:39             🧑  作者: Mango


需要错误处理

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

断言和错误功能

为了处理错误,我们经常使用两个函数-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]: ?

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

作为程序员,最重要的是要确保您对编写的程序进行适当的错误处理。使用错误处理可以确保处理超出边界条件的意外条件,而不会打扰程序的用户。