Lua设置默认错误处理程序

汤玛士

默认的lua_pcall错误处理程序(从Lua 5.3开始)不执行任何操作,使异常消息保留在堆栈的顶部。我们希望对此进行更改,以便luaL_tracebacklua_pcall发生故障时,除了堆栈顶部的异常消息外,还可以进行追溯

不幸的是,我认为这意味着我们需要在所有pcall的下面插入错误处理程序。执行此操作的最可靠的方法似乎是这样的:

/* push function and arguments */
lua_pushstuff...

/* push error handler */
lua_pushcfunction(L, my_error_handler);

/* move the error handler just below the function and arguments */
lua_insert(L, -(number of args + 1));

if (lua_pcall(L, nargs, nresults, -(number of args + 1))) {
    /* error here (my_error_handler was invoked) */
    /* do something with lua_tostring(L, -1) */
}

/* afterwards, pop the error handler (it may be below return values) */
lua_pop(L, 1);

但这在每个pcall上都会引入噪音(我们有很多,因为我们有一些从C异步调用的Lua回调),并且感觉有些重复。我以为可以将其包装在lua_mypcall自动执行此设置的某些函数中,但是我有两个问题:

  1. 在调用之前(或内部),这种方法是否会因更复杂的堆栈操作而中断?(我还不太熟悉Lua堆栈)

  2. 由于我们希望对大多数pcall进行追溯,因此有必要将此错误处理程序设置为默认值,并手动指定先前的错误处理程序(不执行任何操作),因此有一种方法可以全局更改默认错误Lua状态的处理程序?

我看到其中lua_pcallk包含一些代码errfunc == 0,但似乎不可配置。我们可以修改Lua实现以手动更改默认值,但要避免这种情况。

我们正在使用Lua 5.3。谢谢。

西菲乔

您的基本方法是合理的,但缺少lua_remove(而不是lua_pop),并且堆栈索引错误。试试这个:

int lua_mypcall( lua_State* L, int nargs, int nret ) {
  /* calculate stack position for message handler */
  int hpos = lua_gettop( L ) - nargs;
  int ret = 0;
  /* push custom error message handler */
  lua_pushcfunction( L, my_error_handler );
  /* move it before function and arguments */
  lua_insert( L, hpos );
  /* call lua_pcall function with custom handler */
  ret = lua_pcall( L, nargs, nret, hpos );
  /* remove custom error message handler from stack */
  lua_remove( L, hpos );
  /* pass return value of lua_pcall */
  return ret;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

未调用烧瓶默认错误处理程序

来自分类Dev

如何在ExpressJS中触发路由器错误处理程序而不是默认错误处理程序

来自分类Dev

Scala Futures:每个新创建或映射的异常的默认错误处理程序

来自分类Dev

当没有路由匹配时覆盖Falcon的默认错误处理程序

来自分类Dev

如何更改Dingo / Api中的默认错误处理程序?

来自分类Dev

是否可以重写CodeIgniter框架的默认错误处理程序以将其输出为json?

来自分类Dev

Scala Futures:每个新创建或映射的异常的默认错误处理程序

来自分类Dev

Oracle和PostgreSQL中不同的默认错误处理

来自分类Dev

为什么Express的默认错误处理程序从Readable流中发出错误时会捕获错误?

来自分类Dev

除了自定义错误处理程序之外,如何在使用默认错误处理程序时避免级联

来自分类Dev

如何覆盖 Slim 的第 2 版默认错误处理功能

来自分类Dev

Lua错误处理

来自分类Dev

调用Lua函数时的LuaBind C ++错误处理程序

来自分类Dev

Lua,错误处理pcall()

来自分类Dev

C ++ Lua错误处理

来自分类Dev

Lua,错误处理pcall()

来自分类Dev

angularjs $ translate:在错误处理程序中获取默认翻译

来自分类Dev

在我的自定义错误处理程序中将php错误传递给默认的php错误处理程序

来自分类Dev

在自举的Firefox扩展中设置全局错误处理程序

来自分类Dev

如何替换Lua默认错误打印?

来自分类Dev

如何替换Lua默认错误打印?

来自分类Dev

Lua-需要后备/错误处理

来自分类Dev

错误处理程序中的错误处理

来自分类Dev

将php错误传递到我的自定义错误处理程序中的默认php错误处理程序

来自分类Dev

C程序中的错误处理程序

来自分类Dev

VBA:错误处理程序中的错误

来自分类Dev

使用异步/等待时,错误处理程序返回默认值

来自分类Dev

IDE 会在设置错误处理程序时引发 Excel VBA 运行时错误

来自分类Dev

laravel日期默认错误

Related 相关文章

  1. 1

    未调用烧瓶默认错误处理程序

  2. 2

    如何在ExpressJS中触发路由器错误处理程序而不是默认错误处理程序

  3. 3

    Scala Futures:每个新创建或映射的异常的默认错误处理程序

  4. 4

    当没有路由匹配时覆盖Falcon的默认错误处理程序

  5. 5

    如何更改Dingo / Api中的默认错误处理程序?

  6. 6

    是否可以重写CodeIgniter框架的默认错误处理程序以将其输出为json?

  7. 7

    Scala Futures:每个新创建或映射的异常的默认错误处理程序

  8. 8

    Oracle和PostgreSQL中不同的默认错误处理

  9. 9

    为什么Express的默认错误处理程序从Readable流中发出错误时会捕获错误?

  10. 10

    除了自定义错误处理程序之外,如何在使用默认错误处理程序时避免级联

  11. 11

    如何覆盖 Slim 的第 2 版默认错误处理功能

  12. 12

    Lua错误处理

  13. 13

    调用Lua函数时的LuaBind C ++错误处理程序

  14. 14

    Lua,错误处理pcall()

  15. 15

    C ++ Lua错误处理

  16. 16

    Lua,错误处理pcall()

  17. 17

    angularjs $ translate:在错误处理程序中获取默认翻译

  18. 18

    在我的自定义错误处理程序中将php错误传递给默认的php错误处理程序

  19. 19

    在自举的Firefox扩展中设置全局错误处理程序

  20. 20

    如何替换Lua默认错误打印?

  21. 21

    如何替换Lua默认错误打印?

  22. 22

    Lua-需要后备/错误处理

  23. 23

    错误处理程序中的错误处理

  24. 24

    将php错误传递到我的自定义错误处理程序中的默认php错误处理程序

  25. 25

    C程序中的错误处理程序

  26. 26

    VBA:错误处理程序中的错误

  27. 27

    使用异步/等待时,错误处理程序返回默认值

  28. 28

    IDE 会在设置错误处理程序时引发 Excel VBA 运行时错误

  29. 29

    laravel日期默认错误

热门标签

归档