首页 文章

在Lua中使用assert和pcall

提问于
浏览
3

根据是否出现错误, pcall(function) 可能会返回:

成功:true和函数的返回值[s] .
失败:错误和错误 .

在我的情况下,我正在调用一个函数来返回一个表,所以如果没有错误,我将从第二个返回值获取我的数据,如果出现错误,我将打印管理错误 .

我怎么能用断言来做?

起初我写了这个:

local ret, data = pcall(the_function)
assert(ret, "Error: "..data)
-- use data from here on.

问题是即使在成功的情况下也会评估断言消息,因此当调用成功时,Lua会抱怨将字符串与表连接 .

这个问题是由于我想使用assert并引用错误,但避免使用像 if not ret then assert(false, "...") end 这样的东西 .

2 回答

  • 6

    试试这个:

    local ret, data = assert(pcall(the_function))
    
  • 4

    如果你不需要改变 pcall 的错误信息,那么lhf的建议是最好的 .

    否则解决方案是:

    local ret, data = pcall( the_function )
    assert( ret, type( data ) == 'string' and "Error: " .. data )
    

    或者这个,这是一个更清洁的方法:

    local ret, data = pcall( the_function )
    if not ret then error( "Error: " .. data ) end
    

    如果 pcall 没有给出错误,后者可以完全避免评估错误消息表达式 .

相关问题