【问题标题】:Lua: no stack trace when calling error() without arguments?Lua:在没有参数的情况下调用 error() 时没有堆栈跟踪?
【发布时间】:2013-08-03 10:09:43
【问题描述】:

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

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 参数:

错误(消息[,级别])

终止最后调用的受保护函数并返回消息为 错误信息。函数错误永远不会返回。通常,错误会增加 关于错误位置的一些信息 信息。 level 参数指定如何获取错误位置。 使用级别 1(默认),错误位置是错误的位置 函数被调用。 Level 2 将错误指向函数所在的位置 所谓的错误被称为;等等。通过 0 级可避免 在消息中添加错误位置信息。

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

【问题讨论】:

    标签: error-handling lua


    【解决方案1】:

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

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

    error (message [, level])
    

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

    assert()的原型对比:

    assert (v [, message]) 
    

    如您所见,assert() 中的message 是可选的。

    【讨论】:

    • @DmitryPashkevich 它实际上不起作用,因为 error 需要一个 message 参数。否则,它可能取决于函数的实现,并可能导致其他错误。如果你真的只想传递一个空字符串error("")
    • @DmitryPashkevich 因为 Lua 可以接受不兼容的参数数量,在这种情况下,error 将接收第一个参数为 nil
    • 所以 error() 函数可能会因内部错误而失败,并且无法正常完成……这很有道理,谢谢!
    猜你喜欢
    • 2013-12-31
    • 2016-05-12
    • 1970-01-01
    • 2011-02-05
    • 2018-08-20
    • 2010-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多