Lua Academy · レッスン

状態管理とエラー処理

保護付き呼び出しにlua_pcallを使い、C層でエラーを処理します。

レッスン 4/413 ステップ

「状態管理とエラー処理」は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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Lua C APIのスタックモデル
  2. CからのLua関数呼び出し
  3. LuaへのC関数の登録
  4. 状態管理とエラー処理
← Lua Academyに戻る