如何在 Lua 中抛出错误?

是否可以从一个函数中抛出一个 Lua 错误,以便由调用该函数的脚本处理?

例如,以下代码将在注释处抛出一个错误

local function aSimpleFunction(...)
    string.format(...) -- 错误在这里
end

aSimpleFunction("An example function: %i",nil)

但我更希望捕获错误并由函数调用者抛出自定义错误

local function aSimpleFunction(...)
    if pcall(function(...)
        string.format(...)
    end) == false then
       -- 我想向调用这个函数的任何东西抛出一个自定义错误
    end

end

aSimpleFunction("An example function: %i",nil) -- 想要在这里开始取消报错

我的意图是在实际使用中,我的函数会更加复杂,我希望提供更有意义的错误消息

点赞
用户646619
用户646619

使用error函数

error("something went wrong!")
2016-03-02 02:58:22
用户3979429
用户3979429

捕获错误与使用 pcall 一样简单

My_Error()
    --某种错误
end

local success, err = pcall(My_Error)

if not success then
    error(err)
end

毫无疑问,您会问这是如何工作的,好的,pcall在一个 _受保护的线程_(受保护调用)中运行函数,并返回一个布尔值,以指示它是否成功运行,以及一个值(它返回的值/错误)。

此外,不要认为这意味着函数的参数是不可能的,只需将它们作为参数传递给 pcall

My_Error(x)
    print(x)
    --某种错误
end

local success, err = pcall(My_Error, "hi")

if not success then
    error(err)
end

要获取更多错误处理控制,请参见http://www.lua.org/manual/5.3/manual.html#2.3http://wiki.roblox.com/index.php?title=Function_dump/Basic_functions#xpcall

2016-03-02 14:24:02
用户3196468
用户3196468

错误的堆栈级别可以在抛出新错误时指定。

error("错误消息") -- 在当前堆栈上抛出
error("错误消息", 2) -- 抛到调用者处
error("错误消息", 3) -- 抛到下一个调用者处

通常,error会在消息的开头添加有关错误位置的一些信息。level参数指定如何获取错误位置。使用级别1(默认值)时,错误位置是调用error函数的位置。级别2指向调用error的函数调用的位置,以此类推。将级别设置为0可以避免将错误位置信息添加到消息中。

使用问题中提供的示例

local function aSimpleFunction(...)
    if pcall(function(...)
        string.format(...)
    end) == false then
       error("无法格式化文本的函数",2)
    end

end

aSimpleFunction("一个示例函数:%i", nil) –- 产生错误
2016-03-03 00:01:37