2012-01-06 9 views
6

私は、複数のパラメータをとり、パラメータと同数の値を返すlua関数を持っています。各戻り値はパラメータに対応します。説明、データベースからキー/値ペアの値を読み込む機能を検討する:複数の値を返すlua関数からのエラーを返すためのベストプラクティス

val1, val2, val3 = my_function("key1", "key2", "key3"); 
val1 = my_function("key1"); 

my_functionからエラーを返すための最良の方法は何ですか?(例えば、提供された「キー」が無効な場合)

エラーの場合は2つの値、つまりエラーの場合はnilとエラー文字列を返します。これが最善のアプローチですか?

val1, val2, val3 = my_function("key1", "key2", "key3"); 
if val1 then 
    -- Use val1, val2, and val3. 
else 
    print("ERROR: " .. val2); 
end 

編集

いくつかの追加点:例えば

  1. LUAスクリプトがlua_pcall()を使用してCプログラム内から実行されています。
  2. スクリプトが失敗した場合、Cプログラムは中断してはなりません。
  3. my_function()
  4. my_function()が失敗した場合、それはまた、それが失敗した理由を示すエラーコード(またはメッセージ)を返すべきC.
  5. に実装されています。
  6. Luaのエラーをスローする標準的な方法は、誤差関数( manualapi)を介して行われる

答えて

6

又は(内部とにかくerrorを使用)assert介し。

あなたの関数はC言語であるので、同じ効果を得るには、lua_errorを呼び出す必要があります。

しかし、あなたの機能は現在「安全でない」ことに注意してください。

val1, val2, val3 = my_function("key1", "key2", "key3") 

は、時にはそれがプログラム「ちょうどクラッシュを聞かせしても大丈夫です:無修正場合KEY1、KEY2またはKEY3は、「誤った」であれば、次のコードは、「例外を投げる」とそのプログラムを停止するのと同等の操作を行います"入力が間違っている場合。設定に応じて、最後のエラーとスタックトレースなどのメッセージが表示されます。

「プログラムのクラッシュをさせることは」できない場合は、あなたがpcall機能を使用して、そしてokと呼ばれる新しい変数を追加することで、「のtry-catchを」ブロックとそれを囲むのと同等の操作を行うことができます

ok, val1, val2, val3 = pcall(my_function, "key1", "key2", "key3") 
if ok then 
    -- Use val1, val2, and val3. 
else 
    print("ERROR: " .. val1) -- notice that we use val1 here, not val2 
end 

pcallを正確にmy_functionの上に置く必要はないことに注意してください。例外と同様に、エラー回復はコールチェーンでより高くなる可能性があります:my_functionを呼び出す関数またはその関数を呼び出す関数あなたはgrandParentと呼ばれる1からparentと呼ばれる機能、および親からmy_functionを呼び出す場合たとえば、あなたはこれを行うことができます。

-- parent is "insecure" since my_function is "unprotected" 
function parent(key1, key2) 
    local val1, val2, val3 = my_function(key1, key2, "key3") 
    return val1, val2, val3 
end 

-- grandParent calls parent in a "safe" way 
function grandParent() 
    local ok, val1, val2, val3 = pcall(parent, "key1", "key2") 
    if ok then 
    -- Use val1, val2, and val3. 
    else 
    print("ERROR: " .. val1) 
    end 
end 
+0

いくつかの点を明確にするために質問を編集しました。 luaスクリプト(最終的に 'my_function()'を呼び出す)は 'lua_pcall()'でCから実行されるので、上記のように 'my_function()'は "ok"変数を返すべきですか? (例えば、「ok、val1、val2、val3 = my_function()」)。 – Ben

+0

@Ben、そうですね、私は追加の 'ok'値を含めるでしょう - これは最もクリーンな方法です。私もデザインのリビジョンをお勧めします。両方の関数がC言語になっているので、おそらくLuaを忘れてC言語のすべてをやっているほうが簡単です(そして速くなります)。 – kikito

+0

@kikto、分かりやすくてありがとう。この場合、製品を拡張するためにlua(または同等のもの)を使用することは間違いなく意味があります。 – Ben

0

通常の練習は、プログラムが(たとえば、不良ファイルハンドルを回復できない場合、エラーをスローすることです)とそれが回復できるときにシグナルエラー(例えば、ファイルが見つかりません)。あなたのケースでは、私は無効なキーのために単にnilを返すことが最善の方法だと思います。

+0

my_function()が失敗した理由も返すようにするには、 'val1、val2、val3 = my_function()'が失敗した場合、 'val1'は' nil'、 'val2'はエラーコードでなければなりません/メッセージ? – Ben

+0

@Ben、いいえ、私は唯一の理由は "無効なキー"だと思った。 – lhf

関連する問題