4

私は電話しようとしています:

LuaState.pcall(num_args,num_returns, error_handler_index).  

この関数のエラー ハンドラを設定する方法を知る必要があります。実際、誰かが Lua 関数を呼び出し、LuaJava を使用して数値結果を取得する方法を示してくれたらいいと思います。これにより、多くの時間と質問を節約できます。エラー関数のシグネチャと、LuaState スタックの適切なポイントに配置する方法を探していますが、見つかりません。すべての Java->Lua の例は、戻りなしで値を出力しているか、Lua を使用して渡された Java オブジェクトに値を設定しています。Lua 関数を直接呼び出して結果を返す方法を知りたいです。

更新: 1 つの解決策は、LuaState.pcall(1,1,0) を使用してエラー ハンドラを渡さず、エラー ハンドラにゼロを渡すことです。

String errorStr;
L.getGlobal("foo");
L.pushNumber(8.0);
int retCode=L.pcall(1,1,0);
if (retCode!=0){
    errorStr =  L.toString(-1);
}
double finalResult = L.toNumber(-1);

calc.lua がロードされた場所:

function foo(n) 
 return n*2 
end

エラーハンドラも設定する方法はありますか? ありがとう

4

2 に答える 2

1

スタック トレースバックも必要な場合は (そうすると思います :)、debug.tracebackエラー関数として渡すことができます。AndroLua での実装方法を見てみましょう。

基本的に、スタックが次のように設定されていることを確認する必要があります。

  • エラーハンドラ ( debug.traceback)
  • 呼び出したい関数
  • パラメーター

あなたの例では次のようにすることができます:

L.getGlobal("debug");
L.getField(-1, "traceback");      // the handler
L.getGlobal("foo");               // the function
L.pushNumber(42);                 // the parameters
if (L.pcall(1, 1, -3) != 0) { ... // ... you know the drill...
于 2011-12-24T13:51:41.790 に答える
0

エラーを処理する Lua 関数がどこかにあると仮定します。

function err_handler(errstr)
  -- exception in progress, stack's unwinding but control 
  -- hasn't returned to caller yet
  -- do whatever you need in here
  return "I caught an error! " .. errstr
end

err_handlerその関数を pcall に渡すことができます:

double finalResult;

L.getGlobal("err_handler"); 
L.getGlobal("foo");
L.pushNumber(8.0);

// err_handler, foo, 8.0
if (L.pcall(1, 1, -3) != 0)
{
    // err_handler, error message
    Log.LogError( L.toString(-1) );  // "I caught an error! " .. errstr
}
else 
{
    // err_handler, foo's result
    finalResult = L.toNumber(-1);
}
// After you're done, leave the stack the way you found it
L.pop(2);
于 2011-12-24T07:09:01.533 に答える