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