Menu
Coddy logo textTech

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 を適切に処理できます。

challenge icon

チャレンジ

簡単
関数 safeCalculate を記述してください。この関数は operationab を受け取り、計算結果またはエラーメッセージを返します。

この関数では、要求された数学演算を安全に実行するために 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
quiz icon腕試し

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

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

自分で練習してみよう: Luaオンラインコンパイラ