最初の版は Lua 5.0 向けに書かれました。依然として後々のバージョンにも大いに関連していますが、いくらか相違点があります。
第 4 版は Lua 5.3 を対象としており、Amazon や他の書店で購入できます。
本書を購入することで、Lua プロジェクトをサポートすることにもなります。


8.5 – エラーメッセージとトレースバック

エラーメッセージとして任意のタイプの値を使用できますが、通常、エラーメッセージは問題を説明する文字列です。内部エラー(テーブル以外の値をインデックスしようとするなど)が発生した場合、Lua がエラーメッセージを生成します。それ以外の場合は、エラーメッセージは `error` 関数に渡された値です。いずれの場合も、Lua はエラーが発生した場所に関する情報を追加しようとします。

    local status, err = pcall(function () a = 'a'+1 end)
    print(err)
     --> stdin:1: attempt to perform arithmetic on a string value
    
    local status, err = pcall(function () error("my error") end)
    print(err)
     --> stdin:1: my error
位置情報は、ファイル名(例では `stdin`)と行番号(例では 1)を示します。

`error` 関数には追加の第 2 パラメータがあり、エラーをレポートする *レベル* が示されます。それを使用して、他の誰かにエラーの責任を負わせることができます。たとえば、関数を作成し、その最初のタスクが正しく呼び出されたかどうかをチェックするとします。

    function foo (str)
      if type(str) ~= "string" then
        error("string expected")
      end
      ...
    end
そうすると、誰かが間違った引数で関数を呼び出します。
    foo({x=1})
Lua は、結局のところ、`error` を呼び出したのは `foo` であるため、あなたの関数に指を向け、真犯人の呼び出し元ではありません。これを修正するには、レポートしているエラーは呼び出し階層のレベル 2 で発生したことを `error` に知らせます(レベル 1 はあなた自身の関数)。
    function foo (str)
      if type(str) ~= "string" then
        error("string expected", 2)
      end
      ...
    end

エラーが発生した場合、エラーが発生した場所に関する情報だけでなく、デバッグ情報を詳細に知りたいことがよくあります。少なくとも、エラーにつながる完全な呼び出しスタックを表示する、トレースバックが必要です。 `pcall` がエラーメッセージを返したとき、スタックの一部(エラー時点に達した部分)を破棄します。その結果、トレースバックが必要な場合は、`pcall` が戻る前に構築する必要があります。そうするために、Lua は `xpcall` 関数を提供します。これは呼び出される関数に加えて、第 2 の引数である *エラーハンドラ関数* を受け取ります。エラーが発生した場合、Lua はスタックが解除される *前に* そのエラーハンドラを呼び出し、デバッグライブラリを使用してエラーに関する追加情報を収集できるようにします。一般的なエラーハンドラには、Lua プロンプトを使用して、エラーが発生したときの状況を自分で確認できる `debug.debug`(後でデバッグ 라이브러リの説明の中で詳細に説明します)と、トレースバック付きの拡張エラーメッセージを作成する `debug.traceback` があります。後者は、スタンドアロンインタープリタが自分のエラーメッセージを作成するために使用する関数です。また、`debug.traceback` をいつでも呼び出して、現在の実行のトレースバックを取得できます。

    print(debug.traceback())