【问题标题】:how do I properly call an exception in the lua interpreter如何在 lua 解释器中正确调用异常
【发布时间】:2014-01-09 01:51:06
【问题描述】:

我使用的是 lua 5.1

如果我尝试将一个数除以零、将零数提高到负幂或以零为模,我希望 lua 计算失败并打印错误。

我所做的就是改变这样的计算定义

#define luai_numdiv(L,a,b)  ((a)/(b))

这样的事情

inline lua_number luai_numdiv(lua_State *L, lua_Number a, lua_Number b){
    if(b != cast_num(0))
        return (a)/(b);
     else
        luaD_throw(L, LUA_ERRRUN);
     }

这根本不起作用。我认为这与 luaD_Throw 是一种不正确的方式导致 lua 中的计算失败有关。

如何正确地使 lua 中的计算失败?

【问题讨论】:

  • 你确定你使用的是 Lua 5.1 吗? 5.1 中的luai_numdiv 不接收L。它在 5.2 中。
  • 我手动添加的。无论在哪里使用。

标签: exception-handling lua


【解决方案1】:

您的代码有效。它只是不会发出任何错误消息。

尝试在luaD_throw(L,LUA_ERRRUN) 之前添加lua_pushliteral(L,"division by zero")。

或使用luaG_runerror(L,"division by zero") 而不是luaD_throw(L,LUA_ERRRUN) 以获得更多信息的错误消息。

【讨论】:

  • 这也适用于 const 折叠吗?因为我在做 c = 5 / 0 而不是当 a = 5 b = 0 c = a / b 时确实收到一条错误消息
  • 有趣,我从未见过这些功能。为什么不是 luaL_error 或 lua_error?
  • 常量折叠明确避免被零除。请参阅lcode.c 中的constfolding。
  • 核心不会调用lua_error 或luaL_error,因为它必须进行一些清理工作。
猜你喜欢
  • 2014-08-05
  • 1970-01-01
  • 2011-09-16
  • 2018-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
  • 2016-02-01
相关资源
最近更新 更多