サーチ…


pcallの使用

pcallは "保護された呼び出し"の略です。関数にエラー処理を追加するために使用されます。 pcallは他の言語のtry-catch同じように動作します。 pcallの利点は、 pcallpcallれた関数でエラーが発生した場合でも、スクリプトの実行全体が中断されていないことpcallpcall呼び出された関数内でエラーが発生すると、エラーがスローされ、残りのコードは実行を継続します。


構文:

pcall( f , arg1,···)

戻り値:

2つの値を返します。

  1. status(boolean)
  • 関数がエラーなしで実行された場合はtrueを返します。
  • 関数内でエラーが発生した場合はfalseを返します。
  1. ファンクションブロック内でエラーが発生した場合は、ファンクションまたはエラーメッセージの戻り値。

pcallはさまざまな場合に使用されますが、一般的なものは関数に与えられた関数からエラーを捕捉することです。たとえば、この関数があるとしましょう:

local function executeFunction(funcArg, times) then
    for i = 1, times do
        local ran, errorMsg = pcall( funcArg )
        if not ran then
            error("Function errored on run " .. tostring(i) .. "\n" .. errorMsg)
        end
    end
end

指定された関数が実行3でエラーになると、エラーメッセージはユーザーには関数から来ていないことがわかりますが、関数に渡された関数からは明らかになります。また、これを念頭に置いて、派手なBSoDをユーザーに知らせることができます。しかし、この機能を実装しているのは、APIを使用していない可能性が高いためです。

例A - pcallなしの実行

function square(a)
  return a * "a"    --This will stop the execution of the code and throws an error, because of the attempt to perform arithmetic on a string value
end

square(10);

print ("Hello World")    -- This is not being executed because the script was interrupted due to the error

例B - pcallによる実行

function square(a)
  return a * "a"
end

local status, retval = pcall(square,10);

print ("Status: ", status)        -- will print "false" because an error was thrown.
print ("Return Value: ", retval)  -- will print "input:2: attempt to perform arithmetic on a string value"
print ("Hello World")    -- Prints "Hello World"

- 完璧なコードの実行

function square(a)
  return a * a
end

local status, retval = pcall(square,10);

print ("Status: ", status)        -- will print "true" because no errors were thrown 
print ("Return Value: ", retval)  -- will print "100"
print ("Hello World")    -- Prints "Hello World"

Luaでのエラー処理

以下の関数があると仮定します:

function foo(tab)
  return tab.a
end -- Script execution errors out w/ a stacktrace when tab is not a table

少し改善しましょう

function foo(tab)
  if type(tab) ~= "table" then
    error("Argument 1 is not a table!", 2)
  end
  return tab.a
end -- This gives us more information, but script will still error out

エラーが発生しても関数がプログラムをクラッシュさせたくない場合は、次のことを行うのがluaの標準です。

function foo(tab)
    if type(tab) ~= "table" then return nil, "Argument 1 is not a table!" end
    return tab.a
end -- This never crashes the program, but simply returns nil and an error message

今、私たちはそのような振る舞いをする関数を持っています。次のようなことができます:

if foo(20) then print(foo(20)) end -- prints nothing
result, error = foo(20)
if result then print(result) else log(error) end

何か問題が生じた場合にプログラムをクラッシュさせたい場合は、これを行うこともできます:

result, error = foo(20)
if not result then error(error) end

幸いにも私たちは毎回そのすべてを書く必要はありません。 luaにはまさにこれを行う関数があります

result = assert(foo(20))


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow