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
)。