Menu
CoddyTech

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() がそれを捕捉します。プログラムは実行を続け、ステータス値を確認することでエラーを適切に処理できます。

challenge icon

チャレンジ

簡単

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
quiz icon腕試し

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

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

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