在__newindex调用的源处报告错误,而不是在__newindex函数内部

Ale*_*lex 5 error-handling lua

我有一个metatable具有以下__newindex功能:

__newindex = function(t, key, value)
  set_value(t.sprite_number, key, value)
end
Run Code Online (Sandbox Code Playgroud)

这让我允许用户在我的lua对象上设置"属性"(有相应的__index功能,但它并不真正相关).

set_value是一个C函数.如果你试图在"属性"上设置错误的类型,比如在整数属性上设置字符串值,则C代码会这样做

luaL_error (l, "property must be a number");
Run Code Online (Sandbox Code Playgroud)

这工作正常,除了从lua报告的错误

[string "-- init.lua..."]:10: property must be a number
Run Code Online (Sandbox Code Playgroud)

这是指我的__newindex函数中的set_value函数调用.这不是很有帮助.我希望错误指向设置错误值的位置,即在您执行的位置

object.property = "expects integer"
Run Code Online (Sandbox Code Playgroud)

我能以某种方式完成这个吗?

小智 5

您可以使用错误功能并提供level参数:

__newindex = function(t, key, value)
  local ok, err = pcall(set_value, t.sprite_number, key, value)
  -- level 2 means that the error will be signaled on 2nd stack frame,
  -- that is the line at which the key has been set
  if not ok then error(err, 2) end
end
Run Code Online (Sandbox Code Playgroud)