pcall() による保護された呼び出し
CoddyのLuaジャーニー「Logic & Flow」セクションの一部 — レッスン 33/54。
何か問題が発生したときに error() はプログラムを停止させますが、クラッシュさせずにエラーを処理したい場合もあります。Luaの pcall() 関数を使用すると、失敗する可能性のあるコードを安全に実行できます。
pcall() という名前は「protected call(保護された呼び出し)」の略です。これは、関数呼び出しを保護レイヤーで包み、あらゆるエラーをキャッチします。プログラムがクラッシュする代わりに、pcall() は何が起こったかに関する情報を返します。
基本的な構文は次の通りです:
local status, result = pcall(functionName, arg1, arg2)pcall()関数は2つの値を返します。1つ目はブール値のステータスで、関数が成功した場合はtrue、エラーが発生した場合はfalseとなります。2つ目の値はステータスによって異なり、成功した場合は関数の戻り値、エラーが発生した場合はエラーメッセージとなります。
実用的な例を次に示します:
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() がそれをキャッチします。プログラムは実行を継続し、ステータス値を確認することでエラーを適切に処理できます。
チャレンジ
簡単operation、a、および b を受け取り、計算結果またはエラーメッセージを返す関数 safeCalculate を作成してください。
この関数は、pcall() を使用して、要求された数学的操作を安全に実行する必要があります。操作文字列に基づいて計算を行う内部関数を作成し、それを pcall() でラップしてエラーをキャッチします。
ロジック:
- 操作のタイプを確認し、計算を実行する内部関数を作成します
- "add" の場合、
a + bを返します - "subtract" の場合、
a - bを返します - "multiply" の場合、
a * bを返します - "divide" の場合、
bが 0 かどうかを確認し、真であればerror("Division by zero")を呼び出し、そうでなければa / bを返します - その他の操作については、
error("Invalid operation")を呼び出します pcall()を使用して内部関数を実行します- 成功した場合は、
"Result: "の後に結果を続けて返します - エラーが発生した場合は、
"Error: "の後にエラーメッセージを続けて返します
パラメータ:
operation(string): 実行する操作 ("add", "subtract", "multiply", または "divide")a(number): 最初のオペランドb(number): 2番目のオペランド
戻り値: "Result: " の後に計算結果が続く文字列、または "Error: " の後にエラーメッセージ(文字列)が続く文字列
チートシート
pcall() 関数(保護された呼び出し)を使用すると、プログラムをクラッシュさせることなく、失敗する可能性のあるコードを安全に実行できます。
基本構文:
local status, result = pcall(functionName, arg1, arg2)pcall() は2つの値を返します:
- status: 関数が成功した場合は
true、エラーが発生した場合はfalse - result: 成功した場合は関数の戻り値、エラーが発生した場合はエラーメッセージ
例:
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これにより、クラッシュする代わりにエラーをキャッチし、プログラムを続行してエラーを適切に処理できるようになります。
自分で試してみよう
function safeCalculate(operation, a, b)
-- ここにコードを書いてください
end
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。