2013-08-02 93 views
2

在Lua中,使用消息參數調用標準error()函數輸出提供的錯誤消息,並且還打印堆棧跟蹤,例如,執行以下代碼:Lua:調用不帶參數的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(默認值),錯誤位置是調用錯誤 函數的位置。級別2將錯誤指向稱爲錯誤的函數 被調用的位置;等等。通過級別0可以避免向消息添加錯誤位置信息 。

我想知道這是否是有意的行爲?海事組織,即使沒有提供消息,仍然可以打印堆棧跟蹤(也可以輸出一些默認文本,例如error),因爲這就是assert()函數的工作原理。

回答

6

的文件並沒有說明省略的第一個消息參數什麼:

是的,確實如此,error()有一個原型是這樣的:

error (message [, level]) 

注意,只有參數裏面的[]是可選的,在這種情況下level,否則參數是強制性的,在這種情況下,message

assert()原型比較:

assert (v [, message]) 

正如你所看到的,在messageassert()是可選的。

+0

好吧,是的,我可以看到'message'是強制性的,但它仍然沒有它... –

+2

@DmitryPashkevich它並沒有真正的工作,因爲'錯誤'需要'message'參數。否則它可能取決於函數的實現並可能導致其他錯誤。如果你真的想傳遞一個空字符串'error(「」)' –

+1

@DmitryPashkevich因爲Lua可以使用不兼容的參數,所以'error'將接收第一個參數爲'nil'。 –