3

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ドキュメントには、最初の引数の省略については何も書かれていません。

エラー (メッセージ [, レベル])

最後に呼び出された保護された関数を終了し、メッセージをエラー メッセージとして返します。関数エラーは返されません。通常、error はメッセージの先頭にエラー位置に関する情報を追加します。level 引数は、エラー位置を取得する方法を指定します。レベル 1 (デフォルト) では、エラー位置はエラー関数が呼び出された場所です。レベル 2 は、エラーを呼び出した関数が呼び出された場所をエラーに示します。等々。レベル 0 を渡すと、エラー位置情報がメッセージに追加されるのを回避できます。

これが意図した動作なのか、そうでないのか疑問に思っています。errorIMOは、メッセージが提供されていなくても、スタックトレースを出力する(そして、デフォルトのテキストなどを出力する)ことは理にかなっています。それがassert()関数の仕組みだからです。

4

1 に答える 1

7

ドキュメントには、最初のメッセージ引数の省略については何も記載されていません。

はい、error()次のようなプロトタイプがあります。

error (message [, level])

内部の引数のみ[]がオプションであることに注意してください。この場合は です。levelそれ以外の場合、引数は必須です。この場合はmessageです。

のプロトタイプとの比較assert():

assert (v [, message]) 

ご覧のとおり、messageinassert()はオプションです。

于 2013-08-02T08:44:31.913 に答える