在Lua中使用pcall和assert。

根据出现错误与否的情况,pcall(function) 可能返回:

成功:true 和该函数的返回值[s]。

失败:false 和错误。

在我的情况下,我调用一个返回表的函数,所以在没有错误的情况下,我将从第二个返回值中获取我的数据,而在错误的情况下,我将打印错误。

那么如何使用 assert 实现呢?

起初我写下这个:

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

问题是即使调用成功,assert 消息仍然会被评估,所以当调用成功时,Lua会抱怨将字符串与表连接起来。

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

点赞
用户107090
用户107090

尝试这个:

local ret, data = assert(pcall(the_function))
2013-08-14 11:53:55
用户2633423
用户2633423

如果你不需要改变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不返回错误的情况下计算错误消息表达式。

2013-08-18 23:11:01