Menu
Coddy logo textTech

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 の値をチェックすることでエラーを適切に処理できます。

challenge icon

チャレンジ

簡単

operationa、および 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
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックと制御フローのすべてのレッスン