状態管理とエラー処理
保護付き呼び出しにlua_pcallを使い、C層でエラーを処理します。
「状態管理とエラー処理」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。
複数のLuaステート
同じプロセス内で複数のlua_Stateインスタンスを実行できます。それぞれは完全に独立しており、グローバルとスタックは別々で、デフォルトではメモリを共有しません。
スレッドステート
lua_newthread(L)は、同じグローバル環境を共有しながら独自のスタックを持つ子スレッド(コルーチン)を作成します。これはCでLuaコルーチンを実装する方法です。
ステート間でデータを共有する
独立したLuaステート間でデータを直接渡すことはできません。文字列にシリアライズするか、userdata経由でアクセスできるC側の共有メモリ構造を使用してください。
保護された呼び出しと通常の呼び出し
lua_pcallはエラーを捕捉します(内部ではsetjmp/longjmpを使用します)。lua_callはエラーを伝播させ、プログラムを中止します。本番環境では必ずlua_pcallを使用してください。
// Safe:
if (lua_pcall(L, nargs, nresults, 0) != LUA_OK) {
const char *err = lua_tostring(L, -1);
lua_pop(L, 1);
// handle error
}エラーオブジェクト
Luaのエラーには、文字列だけでなく任意の値を使用できます。error({code=404, msg="not found"})はテーブルをエラーとしてpushします。Cコードは、pcallが失敗したときにスタックからその値を読み取ります。
panicハンドラー
エラーがpcallの外へ漏れた場合(保護なしで呼び出されたC関数など)、Luaは中止する前にlua_atpanic(L, fn)で設定されたpanicハンドラーを呼び出します。
// C code
lua_atpanic(L, function(lua_State *L) {
fprintf(stderr, "PANIC: %s\n", lua_tostring(L, -1));
exit(1);
return 0;
});エラー発生時のスタック復元
lua_pcallがエラーになると、スタックは呼び出し前の状態に復元されます(関数と引数は除かれ、スタックの先頭にエラーオブジェクトが置かれます)。
ステートのクリーンアップ
処理が完了したら、必ずlua_close(L)でステートを閉じてください。これにより、すべての__gcファイナライザが実行され、割り当てられたすべてのメモリが解放されます。
スレッドセーフティ
Luaステートはスレッドセーフではありません。同じステートに対して2つのC API関数を同時に呼び出さないでください。OSスレッドごとに1つのステートを使用するか、mutexでアクセスを直列化してください。
メモリアロケーター
Luaはデフォルトでreallocを使用します。メモリ追跡、上限設定、カスタムプールのために、lua_newstate(allocFn, ud)でカスタムアロケーターを指定できます。
複数ステートによるサンドボックス化
信頼できないコードは、標準ライブラリを開いていない、新しく分離されたLuaステートで実行してください。クラッシュやリソース枯渇の影響をそのステート内に限定できます。
エラー処理に関する質問
lua_callとlua_pcallの違いは何ですか?
復習:ステートとエラーの管理
本番環境ではlua_callを使わず、lua_pcallを使用してください。最後の手段として復旧できるようpanicハンドラーを設定します。スレッドごとに1つのステートを保持します。サンドボックス化には複数の分離されたステートを使用します。クリーンアップのため、必ずlua_closeを呼び出してください。
AI チューターと学ぶ Lua — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 40
- レッスン
- 159
よくある質問
「状態管理とエラー処理」レッスンは無料ですか?
はい。「状態管理とエラー処理」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。
「状態管理とエラー処理」で何を学びますか?
保護付き呼び出しにlua_pcallを使い、C層でエラーを処理します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Lua Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「状態管理とエラー処理」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLua Academyレッスンでコードを書いて実行できますか?
はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。