Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7204108
  • 博文数量: 510
  • 博客积分: 12019
  • 博客等级: 上将
  • 技术积分: 6836
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-01 16:46
文章分类

全部博文(510)

文章存档

2022年(2)

2021年(6)

2020年(59)

2019年(4)

2018年(10)

2017年(5)

2016年(2)

2015年(4)

2014年(4)

2013年(16)

2012年(47)

2011年(65)

2010年(46)

2009年(34)

2008年(52)

2007年(52)

2006年(80)

2005年(22)

分类:

2010-01-27 17:36:29

在用C语言调用LUA脚本引擎时,必须对脚本的错误进行识别和处理

1.错误类型

LUA错误共有以下5种,分别对应的是5个宏定义:

  1. #define LUA_YIELD   1//线程被挂起  
  2. #define LUA_ERRRUN  2//运行时错误  
  3. #define LUA_ERRSYNTAX   3//编译错误  
  4. #define LUA_ERRMEM  4//内存分配错误  
  5. #define LUA_ERRERR  5//在运行错误处理函数时发生的错误  

大体上可以分文两种错误即运行时错误和编译时错误

2.错误返回方式

无论是运行时错误还是编译时错误,都将错误信息返回到堆栈的最顶层,可以通过如下代码打印具体的错误信息

  1. const char* error = lua_tostring(L, -1);//打印错误结果  
  2. printf("%s",error);  
  3. lua_pop(L, 1);   

3.需要在哪些函数使用后加入错误分析机制

   LUA脚本引擎的使用大致上可以分文两步(这里不包含初始化过程)

    第一步是脚本加载:如下的一些函数

  1. int luaL_loadbuffer (lua_State *L,  
  2.                      const char *buff,  
  3.                      size_t sz,  
  4.                      const char *name);  
  5. int luaL_loadfile (lua_State *L, const char *filename);  
  6. int luaL_loadstring (lua_State *L, const char *s);  
  7. /*实际上这些函数都是对int lua_load (lua_State *L, 
  8.               lua_Reader reader, 
  9.               void *data, 
  10.               const char *chunkname);的封装 
  11. */  

这些函数产生的都是编译时错误,即通过这些函数的返回值只能返回编译时错误

第二步是脚本执行,如下的一些函数

  1. lua_pcall (lua_State *L, int nargs, int nresults, int errfunc);  

通过该函数返回的是运行时错误

而像其他的一些如下函数,多是步一,步二的组合函数,本身流程并没有改变,这些函数大致如下

  1. int luaL_dostring (lua_State *L, const char *str);  
  2. int luaL_dofile (lua_State *L, const char *filename);  

可以查看帮助文档

4.错误处理示例

如下代码展示了如何对错误处理信息进行处理及打印出出错信息

  1. #include "stdafx.h"  
  2. extern "C" {  
  3. #include "lua.h"  
  4. #include "lualib.h"  
  5. #include "lauxlib.h"  
  6. }  
  7. void PrintLuaError(lua_State* L,int sErr)  
  8. {  
  9.     if (sErr==0)  
  10.     {  
  11.         return;  
  12.     }  
  13.     const char* error;  
  14.     char sErrorType[256]={0};  
  15.     switch(sErr)  
  16.     {  
  17.     case LUA_ERRSYNTAX://编译时错误  
  18.         /*const char *buf = "mylib.myfun()2222";类似这行语句可以引起编译时错误*/  
  19.         sprintf_s(sErrorType,sizeof(sErrorType),"%s","syntax error during pre-compilation");  
  20.         break;  
  21.     case LUA_ERRMEM://内存错误  
  22.         sprintf_s(sErrorType,sizeof(sErrorType),"%s","memory allocation error");  
  23.         break;  
  24.     case LUA_ERRRUN://运行时错误  
  25.         /*const char *buf = "my222lib.myfun()";类似这行语句可以引起运行时错误,my222lib实际上不存在这样的库,返回的值是nil*/  
  26.         sprintf_s(sErrorType,sizeof(sErrorType),"%s","a runtime error");  
  27.         break;  
  28.     case LUA_YIELD://线程被挂起错误  
  29.         sprintf_s(sErrorType,sizeof(sErrorType),"%s","Thread has Suspended");  
  30.         break;  
  31.     case LUA_ERRERR://在进行错误处理时发生错误  
  32.         sprintf_s(sErrorType,sizeof(sErrorType),"%s","error while running the error handler function");  
  33.         break;  
  34.     default:  
  35.         break;  
  36.     }  
  37.     error = lua_tostring(L, -1);//打印错误结果  
  38.     printf("%s:%s",sErrorType,error);  
  39.     lua_pop(L, 1);   
  40. }  
  41. int main()  
  42. {  
  43.     lua_State *L = luaL_newstate();  
  44.     luaL_openlibs(L);  
  45.     const char *buf = "mylib.myfun()";//注意调用规则  
  46.     int s = luaL_loadstring(L, buf);//只是对代码进行解析并不执行  
  47.     const char* error;  
  48.     if ( s==0 )  
  49.     {  
  50.         s = lua_pcall(L, 0, LUA_MULTRET, 0);  
  51.         if (s!=0)  
  52.         {  
  53.             PrintLuaError(L,s);  
  54.         }  
  55.     }  
  56.     else  
  57.     {  
  58.         PrintLuaError(L,s);  
  59.     }  
  60.     lua_close(L);  
  61.     getchar();  
  62.     return 0;  
  63. }  

7。错误的清除

可以通过int lua_error (lua_State *L);进行,该语句执行一个跳转指令,默认情况下是退出程序即 exit(EXIT_FAILURE);

也可以自己定义跳转函数,这一部分暂时还没有深入研究

阅读(4338) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~