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

この例では、0で除算するとエラーが発生しますが、クラッシュする代わりに、pcall()がエラーを捕捉します。プログラムは実行を続け、ステータス値を確認してエラーを適切に処理できます。

pcall()は、予期していなかったバグも含め、呼び出しの中で発生するすべてのエラーを捕捉し、いずれも同じ方法で報告することを覚えておきましょう。そのため、失敗する可能性のある呼び出しだけを包み、予想される失敗には、前のレッスンで説明したように、nilとメッセージを返す関数を使うのがおすすめです。

challenge icon

チャレンジ

簡単

safeCalculate関数を作成してください。この関数はoperation、a、bを受け取り、計算結果またはエラーメッセージを返します。

この関数では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を指定すると、メッセージの前にファイル名と行番号が付加されないため、返される文字列は正確に"Error: Division by zero"となります。

パラメーター:

  • operation(文字列): 実行する演算("add"、"subtract"、"multiply"、または"divide")
  • a(数値): 第1オペランド
  • b(数値): 第2オペランド

戻り値: 計算結果の前に"Result: "を付けた文字列、またはエラーメッセージの前に"Error: "を付けた文字列

自分で試してみよう

function safeCalculate(operation, a, b)
    -- ここにコードを書いてください
    -- 注: Luaがファイル名と
    -- 行番号をメッセージの前に付けないように、error(message, 0)を呼び出してください。
end
quiz icon腕試し

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

ロジックとプログラムの流れのすべてのレッスン

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