文書の出典
- 出典
- Lua 5.5.1 Documentation
- 上流バージョン
- Lua 5.5.1
- 文書状態
- 翻訳
4.4 – Cでのエラー処理
内部的に、LuaはCのlongjmp機能を使ってエラーを処理します。(C++としてコンパイルした場合、Luaは例外を使います。詳細はソースコードでLUAI_THROWを検索してください。)メモリ割り当てエラーや型エラーなど、何らかのエラーに直面すると、Luaはエラーを発生させます。つまりロングジャンプを行います。保護された環境はsetjmpを使って回復地点を設定し、すべてのエラーは直近のアクティブな回復地点へジャンプします。
C関数内では、lua_errorを呼び出して明示的にエラーを発生させられます。
APIのほとんどの関数は、たとえばメモリ割り当てエラーによって、エラーを発生させる可能性があります。各関数のドキュメントは、エラーを発生させる可能性があるかを示しています。
保護された環境の外でエラーが起きると、Luaはパニック関数(lua_atpanicを参照)を呼び出し、その後abortを呼び出してホストアプリケーションを終了します。パニック関数が決して返らないようにすれば(たとえばLuaの外にある独自の回復地点へロングジャンプすれば)、この終了を回避できます。
パニック関数は、その名前が示すとおり最後の手段です。プログラムはこれを避けるべきです。一般に、LuaステートとともにLuaから呼び出されたC関数は、すでに保護されているはずなので、そのLuaステートに対して必要なことを何でも行えます。ただし、CコードがほかのLuaステート(たとえば関数へのLuaステート引数、レジストリに保存されたLuaステート、またはlua_newthreadの結果)を操作する場合、エラーを発生させないAPI呼び出しでのみ、そのステートを使うべきです。
パニック関数はメッセージハンドラー(§2.3を参照)であるかのように実行されます。特に、エラーオブジェクトはスタックの一番上にあります。ただし、スタック領域について保証はありません。スタックへ何かをプッシュするには、パニック関数はまず利用可能な領域を確認する必要があります(§4.1.1を参照)。
4.4.1 – ステータスコード
APIでエラーを報告するいくつかの関数は、異なる種類のエラーやそのほかの状態を示すために、次のステータスコードを使います。
LUA_OK(0):エラーなし。LUA_ERRRUN:実行時エラー。LUA_ERRMEM:メモリ割り当てエラー。このエラーでは、Luaはメッセージハンドラーを呼び出しません。LUA_ERRERR:別のスタックオーバーフローによって、メッセージハンドラーの実行中に起きたスタックオーバーフロー。多くの場合、このエラーはメッセージハンドラーの実行中に起きた別のエラーの結果です。メッセージハンドラー内のエラーはハンドラーを再び呼び出し、それが再びエラーを生じさせます。これが繰り返され、スタックを使い果たすとこのエラーになります。LUA_ERRSYNTAX:プリコンパイル中の構文エラー、またはバイナリチャンクの形式エラー。LUA_YIELD:スレッド(コルーチン)がyieldした。LUA_ERRFILE:ファイル関連のエラー。たとえば、ファイルを開けない、または読み取れない場合。 これらの定数はヘッダーファイルlua.hで定義されています。