浅析Lua编程中的异常处理

 需要进行错误处理

错误处理是必要的,因为真实世界中的操作通常需要使用复杂的操作,包括文件操作,数据库事务和web服务调用。没人关心错误的业务,涉及保密信息或金钱交易时造成大的损失。

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

  • 语法错误
  • 运行时错误

语法错误

因使用不当造成的各种程序组件,如运算符和表达式中出现语法错误。一个简单的例子中的语法错误如下所示。

代码如下:

a == 2

如你所知,有使用单一等于和双等于之间的差异。使用一个替代其他可导致错误。等于是指分配,比较。同样,表示和有其预定实施这些方式的功能。

另一例为语法错误如下所示。

代码如下:

for a= 1,10
   print(a)
end

当我们运行上面的程序,会得到下面的输出。

代码如下:

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

语法错误更容易处理程序不是运行时错误,因为,Lua解释更清楚地定位误差比的情况下运行时错误。从上面的错误,我们可以很容易知道,添加do语句之前print语句,每个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,并产生一个错误。
维护和故障功能

为了处理错误时,我们经常使用的两个函数断言和错误。一个简单的例子如下所示。

代码如下:

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级可避免增加错误的位置信息的消息。
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

作为一个程序员最重要的是要确保正确的错误处理。使用错误处理可以确保超出边界条件意想不到的条件,而不会干扰该程序的用户进行处理。

(0)

相关推荐

  • Lua中简单的错误处理实例

    昨天遇到另外一位独立游戏开发者,所以多聊了一会,然后-然后就没有看书了.(小若:借口!借口!)   今天来聊聊错误处理吧,不过毕竟这只是前面的章节,书上的内容似乎有点一笔带过的味道. 没关系,简单更好~ 1.红色警报--error 我们应该能经常看到类似以下的错误信息: 复制代码 代码如下: [LUA-print] LUA ERROR: [string "src/main.lua"]:108: [string "src/main.lua"]:89: attempt

  • Lua极简入门指南(三): loadfile和错误处理

    编译 Lua 虽然是解释性语言,但 Lua 源码总是被编译为中间形式后再执行. dofile 用于载入并执行一个 Lua 文件,相比之下,loadfile 用于载入一个 Lua 文件,但并不执行,确切的说 loadfile 编译了一个 chunk,并返回此被编译的 chunk(被作为一个函数): 复制代码 代码如下: c = loadfile('./test.lua') c() dofile 可以被实现为: 复制代码 代码如下: function dofile(filename)     loc

  • Lua中的异常处理pcall、xpcall、debug使用实例

    如果需要在Lua中处理错误,必须使用函数pcall(protected call)来包装需要执行的代码. pcall接收一个函数和要传递个后者的参数,并执行,执行结果:有错误.无错误:返回值true或者或false, errorinfo 复制代码 代码如下: if pcall(function_name, -.) then -- no error else -- some error end 简单示例 复制代码 代码如下: > =pcall(function(i) print(i) end, 3

  • Lua读取和写入文件处理例子

    一.文件读存: 复制代码 代码如下: -- 似乎不支持大文件(不能超过9k?) function FileSaveLoad()       local file = io.open("c:\\in.lua", "r");       assert(file);       local data = file:read("*a"); -- 读取所有内容       file:close();       file = io.open("c

  • Lua函数与字符串处理简明总结

    函数的定义是以function关键字开始的,后面函数的名称,然后是要传递给函数的参数,如果没有参数传给函数,仍然需要用()来表示一个空的参数列表,以end关键字结尾. 复制代码 代码如下: function 函数名()  ...  ...  ... end 1. 单一参数 复制代码 代码如下: function F_1(var)  print("My website is: "  var) end 参数var传递给了函数,并在函数中使用,同时,函数中的参数是局部变量,在函数调用结束后被

  • lua日志文件处理代码

    目前我找到的文件夹的搜索工具,最多可以完成把搜索到的单行的内容,进行输出出来,或者进行一些简单的处理,但是不够灵活. 因此就用lua自己写了个,可以完成自己定义搜索处理函数,进行一些数据的处理,省去了将搜索结果放到excel中再处理的过程. -- search_log.lua tbResult = {}; tbCmdResult = {}; local szTmpFolderPath = os.getenv("temp"); if not szTmpFolderPath then os

  • 浅析Lua编程中的异常处理

     需要进行错误处理 错误处理是必要的,因为真实世界中的操作通常需要使用复杂的操作,包括文件操作,数据库事务和web服务调用.没人关心错误的业务,涉及保密信息或金钱交易时造成大的损失. 在任何编程,总是有错误处理的要求.错误可以是两种类型,其中包括, 语法错误 运行时错误 语法错误 因使用不当造成的各种程序组件,如运算符和表达式中出现语法错误.一个简单的例子中的语法错误如下所示. 复制代码 代码如下: a == 2 如你所知,有使用单一等于和双等于之间的差异.使用一个替代其他可导致错误.等于是指分

  • Lua编程中的一些基本语法整理

    Lua是相当简单易学,让我们开始创建第一个Lua程序! 第一个Lua程序 交互模式编程: Lua中提供了一个名为交互模式模式.在这种模式下,你可以键入一个接一个的指令,并得到立竿见影的效果.此所用的shell使用的是lua-i或只是lua的命令被调用.一旦在这种模式下,按Enter键和互动模式将被启动,如下图所示. $ lua -i $ Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio quit to end; cd, dir and edit

  • Lua编程中使用嵌套循环的使用教程

    Lua编程语言允许使用一个循环内嵌另一个循环.下文将介绍几个例子来说明这一概念. 语法 在Lua中嵌套循环语法语句如下: 复制代码 代码如下: for init,max/min value, increment do    for init,max/min value, increment    do       statement(s)    end    statement(s) end 在Lua编程语言中的嵌套的while循环的语法语句,如下所示: 复制代码 代码如下: while(con

  • 浅析PHP编程中10个最常见的错误

    目前学习PHP很多朋友,在平时的日常程序开发工程中总会遇到各种各样的问题,本篇经验将为大家介绍PHP开发中10个最常见的问题,希望能够对朋友有所帮助. 错误1:foreach循环后留下悬挂指针 在foreach循环中,如果我们需要更改迭代的元素或是为了提高效率,运用引用是一个好办法: $arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } // $arr is now array(2, 4, 6,

  • 简单了解Java编程中对异常处理的运用

    Java异常是一个描述在代码段中发生的异常(也就是出错)情况的对象.当异常情况发生,一个代表该异常的对象被创建并且在导致该错误的方法中被抛出(throw).该方法可以选择自己处理异常或传递该异常.两种情况下,该异常被捕获(caught)并处理.异常可能是由Java运行时系统产生,或者是由你的手工代码产生.被Java抛出的异常与违反语言规范或超出Java执行环境限制的基本错误有关.手工编码产生的异常基本上用于报告方法调用程序的出错状况. Java异常处理通过5个关键字控制:try.catch.th

  • Python编程中的异常处理教程

    1.异常简介 从软件方面来说,错误是语法或是逻辑上的,当python检测到一个错误时,解释器就会指出当前流已经无法继续执行下去,这时候就出现了异常.异常分为两个阶段:首先是引起异常发生的错误,然后是检测和采取可能的措施.常见异常有 NameError.ZeroDivisionError.SyntaxError.IndexError.KeyError.IOError.AttributeError.ValueError. TypeError等.所有的标准/内建异常都是从根异常派生的,目前,有3个直接

  • php5编程中的异常处理详细方法介绍

    1 首先是try,catch <?php  $path = "D:\\\\in.txt";  try //检测异常  {  file_open($path);  }  catch(Exception $e) //捕获异常  {  echo $e->getMessage();  } function file_open($path)  {  if(!file_exists($path)) //如果文件无法找到,抛出异常对象  {  throw new Exception(&q

  • 浅析Java编程中枚举类型的定义与使用

    定义枚举类型时本质上就是在定义一个类,只不过很多细节由编译器帮您补齐了,所以某些程度上,enum关键字的 作用就像是class或interface. 当您使用"enum"定义枚举类型时,实质上您定义出来的类型继承自 java.lang.Enum 类,而每个枚举的成员其实就是您定义的枚举类型的一个实例(Instance),它们都被默认为 final,所以您无法改变它们,它们也是 static 成员,所以您可以透过类型名称直接使用它们,当然最重要的,它们都 是公开的(public). 举个

  • Java编程中10个最佳的异常处理技巧

    在实践中,异常处理不单单是知道语法这么简单.编写健壮的代码是更像是一门艺术,在本文中,将讨论Java异常处理最佳实践.这些Java最佳实践遵循标准的JDK库,和几个处理错误和异常的开源代码.这还是一个提供给java程序员编写健壮代码的便利手册.Java 编程中异常处理的最佳实践 这里是我收集的10个Java编程中进行异常处理的10最佳实践.在Java编程中对于检查异常有褒有贬,强制处理异常是一门语言的功能.在本文中,我们将尽量减少使用检查型异常,同时学会在Java编程中使用检查型VS非检查型异常

  • 深入理解Java编程中异常处理的优劣

    Java编程中的异常处理是一个很常见的话题了,几乎任何一门介绍性的Java课程都会提到异常处理.不过,我认为很多人其实没有真正掌握正确处理异常情况的方法和策略,最多也就不过了解个大概,知道概念.我想对三种不同程度和质量的Java异常处理进行了讨论,所阐述的处理异常的方式按手法的高下分为:好,不好和恶劣三种.同时提供了一些解决这些问题的技巧.首先解释一些java异常处理中必须搞清楚的定义和机制.Java语言规范将自Error类或RuntimeException类衍生出来的任何违例都称作"不可检查&

随机推荐