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.

4

2 回答 2

7

尝试这个:

local ret, data = assert(pcall(the_function))
于 2013-08-14T11:53:55.733 回答
4

如果您不需要更改pcalllhf 建议中的错误消息是最好的。

否则解决方案是:

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-18T23:11:01.420 回答