pcall() による保護された呼び出し
CoddyのLuaジャーニー「ロジックと制御フロー」セクションの一部。レッスン 33/54。
error() は何か問題が発生したときにプログラムを停止させますが、クラッシュさせずにエラーを処理したい場合もあります。Lua の pcall() 関数を使うと、失敗する可能性のあるコードを安全に実行できます。
pcall()という名前は「保護された呼び出し」を意味します。これは関数呼び出しを保護層で包み、あらゆるエラーを捕捉します。プログラムがクラッシュする代わりに、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", 0)を呼び出し、そうでなければa / bを返す - その他の演算の場合は、
error("Invalid operation", 0)を呼び出す pcall()を使用して内部関数を実行する- 成功した場合は、
"Result: "に続けて結果を返す - エラーが発生した場合は、
"Error: "に続けてエラーメッセージを返す
error()の2番目の引数として0を渡してください。この引数はエラーレベルであり、0を指定すると、メッセージの前にファイル名と行番号を付けないようLuaに指示できます。そのため、返される文字列は正確に"Error: Division by zero"になります。
パラメーター:
operation(string): 実行する演算("add"、"subtract"、"multiply"、または"divide")a(number): 1番目のオペランドb(number): 2番目のオペランド
戻り値: 計算結果に続く"Result: "、またはエラーメッセージに続く"Error: "のいずれかを含む文字列(string)
自分で試してみよう
function safeCalculate(operation, a, b)
-- ここにコードを書いてください
-- Note: error(message, 0) を呼び出して、Lua がファイル名と
-- 行番号をメッセージの前に追加しないようにします。
endこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックと制御フローのすべてのレッスン
自分で練習してみよう: Luaオンラインコンパイラ