根据是否引发错误,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
这样的东西。
答案 0 :(得分:6)
试试这个:
local ret, data = assert(pcall(the_function))
答案 1 :(得分: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
没有给出错误,后者可以完全避免评估错误消息表达式。