文書の出典
- 出典
- Lua 5.5.1 Documentation
- 上流バージョン
- Lua 5.5.1
- 文書状態
- 翻訳
2.3 – エラー処理
Luaのいくつかの操作は、エラーを発生させることがある。エラーはプログラムの通常の流れを中断するが、エラーを捕捉することで処理を続行できる。
Luaコードは、error関数を呼び出すことで、明示的にエラーを発生させられる。(この関数が戻ることはない。)
Luaでエラーを捕捉するには、pcall(またはxpcall)を使って保護呼び出しを行える。pcall関数は、指定された関数を保護モードで呼び出す。その関数の実行中に発生したエラーは実行を停止させ、制御は直ちにpcallへ戻り、同関数がステータスコードを返す。
Luaは組み込み型の拡張言語であるため、Luaコードの実行は、ホストプログラム内のCコードからの呼び出しによって開始する。(Luaをスタンドアロンで使用する場合、luaアプリケーションがホストプログラムとなる。)通常、この呼び出しは保護されている。そのため、保護されていないLuaチャンクのコンパイル中または実行中にエラーが発生した場合、制御はホストへ戻り、ホストはエラーメッセージの表示など、適切な措置を取れる。
エラーが発生すると必ず、そのエラーに関する情報を持つエラーオブジェクトが伝播する。Lua自身が生成するエラーでは、エラーオブジェクトは文字列だけである。一方、プログラムはnil以外の任意の値をエラーオブジェクトとしてエラーを生成できる。(エラーオブジェクトがnilの場合、Luaはそれを文字列メッセージへ変更する。)このようなエラーオブジェクトを処理するのは、Luaプログラムまたはそのホストの責任である。歴史的な理由から、エラーオブジェクトは文字列である必要がないにもかかわらず、しばしばエラーメッセージと呼ばれる。
xpcall(Cではlua_pcall)を使用する場合、エラー発生時に呼び出されるメッセージハンドラーを指定できる。この関数は元のエラーオブジェクトを引数として呼び出され、新しいエラーオブジェクトを返す。エラーがスタックを巻き戻す前に呼び出されるため、スタックを調べてスタックトレースバックを作成するなど、エラーに関する追加情報を収集できる。このメッセージハンドラーも保護呼び出しによって保護されている。そのため、メッセージハンドラー内でエラーが発生すると、メッセージハンドラーが再び呼び出される。このループが長く続きすぎた場合、Luaはループを中断し、適切なメッセージを返す。メッセージハンドラーは通常の実行時エラーに対してだけ呼び出される。メモリ割り当てエラー、ファイナライザー実行中のエラー、別のメッセージハンドラー実行中のエラーに対しては呼び出されない。
Luaには警告の仕組みもある(warnを参照)。エラーと異なり、警告がプログラムの実行へ干渉することは一切ない。通常はユーザーへのメッセージを生成するだけだが、この動作はCから調整できる(lua_setwarnfを参照)。