2.3 エラー処理

Lua が行う処理にはエラーを送出するものがあります。エラーはプログラムの通常の実行フローを中断させますが、エラーを捕捉して実行を継続させることもできます。

Lua コードは error 関数を呼ぶことで明示的にエラーを送出できます (この関数は返りません)。

Lua でエラーを捕捉するには保護された呼び出し (protected call) を使います。これは pcall または xpcall を使って行う呼び出しであり、この二つの関数を使うと引数として渡された関数が保護モード (protected mode) で実行されます。与えられた関数の実行中に何らかのエラーが発生すると関数の実行はその時点で停止して制御は pcall に戻り、そのときの状態コードが pcall の返り値となります。

Lua は組み込み用の拡張言語であり、Lua コードの実行はホストプログラムの C コードからの呼び出しによって開始されます (スタンドアローンの Lua を使うときは lua アプリケーションがホストプログラムです)。通常この呼び出しは保護モードとなります。つまり Lua チャンクのコンパイルおよび実行で C 以外のコードから保護されていないエラーが生じると、制御はホストに返ります。ホストはこれを受けてエラーメッセージを表示するといった適切な処置を行います。

エラーが起きると、エラーオブジェクト (error object) がエラーに関する情報を伝達します。Lua 自身はエラーオブジェクトが文字列であるようなエラーしか送出しませんが、プログラムは任意の値をエラーオブジェクトとしてエラーを生成できます。エラーオブジェクトの取り扱いは Lua プログラムあるいはホストに任せられます。歴史的な理由によりエラーオブジェクトはエラーメッセージ (error message) とも呼ばれますが、エラーメッセージが文字列である必要はありません。

xpcall (C では lua_pcall) を使うと、エラーが発生したときに呼び出されるメッセージハンドラを渡すことができます。この関数は元のエラーオブジェクトを引数に受け取り、新しいエラーオブジェクトを返します。この関数はエラーによってスタックが巻き戻される前に呼ばれるので、ここでエラーに関するさらなる情報を収集できます (例えばスタックを調べてスタックトレースバックを作るなど)。メッセージハンドラ自身も保護された呼び出しで保護されるので、この関数でエラーが起きると同じ関数がもう一度呼ばれることになります。このループが長くなった場合には Lua が間に入って適切なメッセージを返します。メッセージハンドラは通常のランタイムエラーに対してだけ呼び出され、ファイナライザや他のメッセージハンドラの実行中に発生したエラー、およびメモリ確保で生じたエラーでは呼び出されません。

Lua には警告 (warning) のシステムもあります (参照: warn)。エラーと異なり警告はプログラムの実行に干渉しません。警告はたいていユーザーへのメッセージを表示するのに使われますが、この動作は C から変更することもできます (lua_setwarnf)。