サーチ…
pcallの使用
pcall
は "保護された呼び出し"の略です。関数にエラー処理を追加するために使用されます。 pcall
は他の言語のtry-catch
同じように動作します。 pcall
の利点は、 pcall
でpcall
れた関数でエラーが発生した場合でも、スクリプトの実行全体が中断されていないことpcall
。 pcall
呼び出された関数内でエラーが発生すると、エラーがスローされ、残りのコードは実行を継続します。
構文:
pcall( f , arg1,···)
戻り値:
2つの値を返します。
- status(boolean)
- 関数がエラーなしで実行された場合はtrueを返します。
- 関数内でエラーが発生した場合はfalseを返します。
- ファンクションブロック内でエラーが発生した場合は、ファンクションまたはエラーメッセージの戻り値。
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