3

在 Lua 中,error()使用 message 参数调用标准函数会输出提供的错误消息并打印堆栈跟踪,例如执行以下代码:

print("hello")
error("oops!")
print("world")

将导致以下输出:

$ lua test.lua
hello
lua: test.lua:2: oops!
stack traceback:
    [C]: in function 'error'
    test.lua:2: in main chunk
    [C]: ?

但是,error()不带参数的调用似乎会使 Lua 无声无息地死掉,而不会打印堆栈跟踪。执行此代码:

print("hello")
error()    // no arguments provided
print("world")

将导致此输出:

$ lua test2.lua
hello

该文档没有说明省略第一个message参数:

错误(消息 [,级别])

终止最后调用的受保护函数并返回 message 作为错误消息。函数错误永远不会返回。通常,error 在消息的开头添加一些关于错误位置的信息。level 参数指定如何获取错误位置。对于级别 1(默认),错误位置是调用错误函数的位置。级别 2 将错误指向调用错误的函数的位置;等等。传递 0 级可避免将错误位置信息添加到消息中。

我想知道这是否是预期的行为?error即使没有提供消息,IMO 仍然打印堆栈跟踪(并且可能输出一些默认文本,例如)是有意义的,因为这就是assert()函数的工作方式。

4

1 回答 1

7

该文档没有说明省略第一个消息参数:

是的,它确实error()有这样的原型:

error (message [, level])

请注意,只有里面的参数[]是可选的,在这种情况下level,否则参数是强制性的,在这种情况下,message

与 的原型比较assert()

assert (v [, message]) 

如您所见,messageinassert()是可选的。

于 2013-08-02T08:44:31.913 回答