pcall() による保護された呼び出し
CoddyのLuaジャーニー「ロジックと制御フロー」セクションの一部 — レッスン 33/54。
error() は問題が発生した際にプログラムを停止させますが、クラッシュさせることなくエラーを処理したい場合もあります。Luaの pcall() 関数を使用すると、失敗する可能性のあるコードを安全に実行できます。
pcall() という名前は "protected call"(保護された呼び出し)を意味します。エラーをキャッチする保護層で関数呼び出しをラップします。プログラムがクラッシュする代わりに、pcall() は何が起きたかに関する情報を返します。
基本構文は次のとおりです。
local status, result = pcall(functionName, arg1, arg2)pcall() 関数は2つの値を返します。1つ目はブーリアン型のステータスで、関数が成功した場合は true、エラーが発生した場合は false になります。2つ目の値はステータスによって異なり、成功した場合は関数の返り値(return 値)、エラーが発生した場合はエラーメッセージ(message)になります。
実践的な例を以下に示します:
function divide(a, b)
if b == 0 then
error("Cannot divide by zero")
end
return a / b
end
local success, result = pcall(divide, 10, 0)
if success then
print("Result: " .. result)
else
print("Error caught: " .. result)
endこの例では、ゼロ除算によってエラーが発生しますが、クラッシュする代わりに pcall() がそれをキャッチします。プログラムは実行を継続し、status の値をチェックすることでエラーを適切に処理できます。
チャレンジ
簡単operation、a、および b を受け取り、計算結果またはエラーメッセージを返す関数 safeCalculate を作成してください。
この関数は pcall() を使用して、要求された数学的演算を安全に実行する必要があります。operation 文字列に基づいて計算を行う内部関数を作成し、それを pcall() でラップしてエラーをキャッチします。
ロジック:
operationの種類を確認して計算を行う内部関数を作成します- "add" の場合、
a + bを返します - "subtract" の場合、
a - bを返します - "multiply" の場合、
a * bを返します - "divide" の場合、
bが 0 かどうかを確認し、真であればerror("Division by zero")を呼び出し、それ以外の場合はa / bを返します - その他の
operationの場合、error("Invalid operation")を呼び出します - 内部関数を実行するために
pcall()を使用します - 成功した場合は、
"Result: "の後に結果を続けて返します - エラーが発生した場合は、
"Error: "の後にエラーメッセージを続けて返します
パラメータ:
operation(文字列): 実行する操作 ("add", "subtract", "multiply", または "divide")a(数値): 最初の被演算子b(数値): 2番目の被演算子
戻り値: "Result: " の後に計算結果が続く文字列、または "Error: " の後にエラーメッセージが続く文字列
自分で試してみよう
function safeCalculate(operation, a, b)
-- ここにコードを書いてください
-- Note: テストランナーはエラーメッセージに行番号が含まれることを期待しています。
-- エラー呼び出しが期待される行にあることを確認するか、テストランナーが許可する場合は単純なエラーメッセージを使用してください。
endこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。