この初版は Lua 5.0 向けに書かれました。今後のバージョンに依然として関連性は大きいものの、相違点があります。
第 4 版は Lua 5.3 をターゲットにしており、Amazon やその他の書店でお買い求めいただけます。
ご著書を購入いただくことは、Lua project をサポートすることにもなります。


8.4 - エラー処理と例外

多くのアプリケーションでは、Lua でエラー処理を行う必要はありません。通常、アプリケーションプログラムがこの処理を行います。すべての Lua のアクティビティは、通常 Lua にチャンクを実行するよう要求するアプリケーションによる呼び出しから開始されます。エラーがある場合、この呼び出しはエラーコードを返し、アプリケーションは適切な処置を講じることがでいます。スタンドアローンのインタープリターの場合、メインループは単にエラーメッセージを表示してプロンプト表示とコマンド実行を続行するだけです。

Lua でエラーを処理する必要がある場合は、pcall(保護呼び出し)関数を使用してコードをカプセル化する必要があります。

Lua コードの一部を実行して、そのコードの実行中に発生したエラーをキャッチしたいとします。まずは、そのコード部分を関数にカプセル化します。ここでは foo と呼びましょう。

    function foo ()
        ...
      if unexpected_condition then error() end
        ...
      print(a[i])    -- potential error: `a' may not be a table
        ...
    end
次に、pcall を使用して foo を呼び出します。
    if pcall(foo) then
      -- no errors while running `foo'
      ...
    else
      -- `foo' raised an error: take appropriate actions
      ...
    end
言うまでもなく、匿名関数を使って pcall を呼び出すこともできます。
    if pcall(function () ... end) then ...
    else ...

pcall 関数は最初の引数を保護モードで呼び出すため、関数が実行中に発生するエラーをキャッチします。エラーがなければ、pcalltrue を返すとともに、呼び出しによって返された値を返します。それ以外の場合は、false とともにエラーメッセージを返します。

エラーメッセージは、名前から想像できるように文字列であるわけではありません。error に渡す Lua の値は、pcall によって返されます。

    local status, err = pcall(function () error({code=121}) end)
    print(err.code)  -->  121
これらのメカニズムは、Lua で例外処理を実行するために必要なすべてを提供します。error を使用して例外をスロー(投げ)し、pcall を使用してそれをキャッチします。エラーメッセージは、エラーの種類を特定します。