Lua 错误处理

Lua 错误处理

程序运行中错误处理是必要的,在我们进行文件操作,数据转移及web service 调用过程中都会出现不可预期的错误。如果不注重错误信息的处理,就会照成信息泄露,程序无法运行等情况。

任何程序语言中,都需要错误处理。错误类型有:

  • 语法错误
  • 运行错误

=================================================================

错误处理

我们可以使用两个函数:assert 和 error 来处理错误。实例如下:

assert首先检查第一个参数,若没问题,assert不做任何事情;否则,assert以第二个参数作为错误信息抛出。

error (message [, level])

功能:终止正在执行的函数,并返回message的内容作为错误信息(error函数永远都不会返回)

通常情况下,error会附加一些错误位置的信息到message头部。

Level参数指示获得错误的位置:

  • Level=1[默认]:为调用error位置(文件+行号)
  • Level=2:指出哪个调用error的函数的函数
  • Level=0:不添加错误位置信息

pcall 和 xpcall、debug

Lua中处理错误,可以使用函数pcall(protected call)来包装需要执行的代码。

pcall接收一个函数和要传递个后者的参数,并执行,执行结果:有错误、无错误;返回值true或者或false, errorinfo。

语法格式如下

if pcall(function_name, ….) then-- 没有错误else-- 一些错误end

pcall以一种"保护模式"来调用第一个参数,因此pcall可以捕获函数执行中的任何错误。

通常在错误发生时,希望落得更多的调试信息,而不只是发生错误的位置。但pcall返回时,它已经销毁了调用桟的部分内容。

Lua提供了xpcall函数,xpcall接收第二个参数——一个错误处理函数,当错误发生时,Lua会在调用桟展看(unwind)前调用错误处理函数,于是就可以在这个函数中使用debug库来获取关于错误的额外信息了。

debug库提供了两个通用的错误处理函数:

  • debug.debug:提供一个Lua提示符,让用户来价差错误的原因
  • debug.traceback:根据调用桟来构建一个扩展的错误消息

>=xpcall(function(i) print(i) error(‘error..‘) end, function() print(debug.traceback()) end, 33) 33 stack traceback: stdin:1: in function ‘‘&nbsp123‘‘

function myfunction()
	n = n/nil
end

function myerrhandler(err)
	print("ERROR", err)
end

status = xpcall(myfunction, myerrhandler)
print(status)

时间: 2024-11-10 01:20:43

Lua 错误处理的相关文章

论 Lua错误处理 之 error assert pcall xpcall 函数的使用和区别

error (message [, level]) 在Lua中使用error函数抛出错误信息,通常包含调用堆栈信息以及错误提示信息! 第一个参数message为自定义的错误提示信息.第二个参数为可选的出错位置信息,默认为1,即为调用error函数的位置:2即为调用error函数的函数的位置:0则不打印出错位置信息! assert (v [, message]) assert是error的包装,将判断之类的操作包装了进去!所以使用assert比之使用error更为方便!第一个参数为nil或判断的结

Lua 5.1 参考手册

Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes 云风 译 www.codingnow.com Copyright © 2006 Lua.org, PUC-Rio. All rights reserved. 1 - 介绍 Lua 是一个扩展式程序设计语言,它被设计成支持通用的过程式编程,并有相关数据描述的设施. Lua 也能对面向对象编程,函数式编程,数据驱动式编程提供很好的支持.

lua参考手册02—程序接口

3 - 程序接口(API) 这个部分描述了 Lua 的 C API , 也就是宿主程序跟 Lua 通讯用的一组 C 函数. 所有的 API 函数按相关的类型以及常量都声明在头文件 lua.h 中. 虽然我们说的是“函数”,但一部分简单的 API 是以宏的形式提供的. 所有的这些宏都只使用它们的参数一次 (除了第一个参数,也就是 lua 状态机), 因此你不需担心这些宏的展开会引起一些副作用. 在所有的 C 库中,Lua API 函数都不去检查参数的有效性和坚固性. 然而,你可以在编译 Lua 时

lua操作常用函数

(1)lua 和 C++之间的交互的基本知识: lua 和 C++ 之间的数据交互通过堆栈进行,栈中的数据通过索引值进行定位,(栈就像是一个容器一样,放进去的东西都要有标号)其中栈顶是-1,栈底是1,也就是第 1 个入栈的在栈底:也可以这么说:正数表示相对于栈底的位置(位移),负数表示相对于栈顶的位置(位移):(2)计算和清空栈中元素的操作:1.函数lua_gettop()用于返回栈中元素的个数,同时也是栈顶元素的索引,因为栈底是1,所以栈中有多少个元素,栈顶索引就是多少:呵呵2.函数lua_s

c++对象与lua绑定

2015.1.29 wqchen. 转载请注明出处 http://www.cnblogs.com/wqchen/ 本文主要探讨c++的类对象和lua脚本的绑定使用,读者需要有一定的lua以及lua的c api接口知识:). 如果你使用过c/c++和lua混合编程,那么肯定会熟悉宿主(c/c++)与脚本(lua)之间函数的注册与调用.userdata等等方面知识.宿主对象与脚本的绑定使用,其实可以看作是userdata与注册函数的整合,只不过多了一层语法糖.下面我们一起来分析一下这层语法糖是怎样实

lua堆栈操作常用函数学习二

/* ** basic stack manipulation */ LUA_API int  <strong> (lua_gettop) (lua_State *L);  </strong><pre class="cpp" name="code"></pre><pre class="cpp" name="code">//返回当前堆栈的大小 LUA_API int lu

lua 5.1语法约定

Lua 5.1参考手册 由罗伯特·Ierusalimschy路易斯Henrique de Figueiredo沃尔德蔡氏 ?一个版权?2006 A¢A€"2012 Lua.org,银行业者.免费的根据Lua许可证. 内容一个?·指数一个?·其他版本一个?·英语一个?·portuguA?Aa年代一个?·espaA?A±ol 1 A¢A€"介绍 Lua是一个扩展编程语言设计的支持一般过程式编程与数据描述设施.它还提供了很好的支持面向对象编程,函数式编程,数据驱动的编程.Lua是打算作为一个

redis翻译_redis lua脚本

Available since 2.6.0.  加入版本2.6 Time complexity: Depends on the script that is executed. 时间复杂度: 取决于脚本的执行 出处:http://blog.csdn.net/column/details/redisbanli.html Introduction to EVAL  介绍EVAL EVAL and EVALSHA are used to evaluate scripts using the Lua i

C/C++与lua实现互调

1,在lua脚本中调用C/C++代码中的函数 在C++中定义函数时必须以lua_State为参数, 以int为返回值才能被Lua所调用. /* typedef int (*lua_CFunction) (lua_State*L); C 函数的类型. 为了正确的和 Lua 通讯,C 函数必须使用下列定义了参数以及返回值传递方法的协议: C 函数通过 Lua 中的堆栈来接受参数,参数以正序入栈(第一个参数首先入栈).因此,当函数开始的时候, lua_gettop(L) 可以返回函数收到的参数个数.第