Luabind でのエラー表示

Luabind 越しに C++ から Lua スクリプトを呼び出した場合、そのスクリプト中でエラーが発生しても、そのままではそのエラー内容が表示されず、どのような間違いがあるのかわかりません。

Luabind で、エラー時に呼び出される関数を登録することができ、エラーの箇所や内容を取得、エラー時の処理を記述、などを行えます。以下では、その方法を紹介します。


Luabind の初期化用のファイル例

int handleError(lua_State* lua)
{
  // !!! エラー内容の表示や、エラー時の処理
}

...

luabind::open(lua)
luabind::set_pcall_callback(&outputError); 


エラーが発生したときに、エラーの箇所と内容を表示するような handleError() の実装例は、以下のようになります。

int handleError(lua_State* lua)
{
  lua_Debug d;
  lua_getstack(lua, 1, &d);
  lua_getinfo(lua, "Sln", &d);
  string error_message = lua_tostring(lua, -1);
  lua_pop(lua, 1);
  stringstream where_message;
  where_message << d.short_src << ":" << d.currentline;

  if (d.name != 0) {
    where_message << "(" << d.namewhat << " " << d.name << ")";
  }
  string output_message = where_message.str() + " " + error_message;
  lua_pushstring(lua, output_message.c_str());
  fprintf(stderr, "%s\n", output_message.c_str());

  return 1;
} 


例えば、

  a
  b 

という Lua スクリプトを実行したときのエラー表示は、

error: error_sample.lua:2: '=' expected near 'b' 

となります。


コメントページ



Generated on Mon May 18 11:11:10 2009 by  doxygen 1.5.7.1