Menu
Coddy logo textTech

pcall() による保護された呼び出し

CoddyのLuaジャーニー「Logic & Flow」セクションの一部 — レッスン 33/54。

何か問題が発生したときに error() はプログラムを停止させますが、クラッシュさせずにエラーを処理したい場合もあります。Luaの pcall() 関数を使用すると、失敗する可能性のあるコードを安全に実行できます。

pcall() という名前は「protected call(保護された呼び出し)」の略です。これは、関数呼び出しを保護レイヤーで包み、あらゆるエラーをキャッチします。プログラムがクラッシュする代わりに、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

チャレンジ

簡単

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

この関数は、pcall() を使用して、要求された数学的操作を安全に実行する必要があります。操作文字列に基づいて計算を行う内部関数を作成し、それを pcall() でラップしてエラーをキャッチします。

ロジック:

  • 操作のタイプを確認し、計算を実行する内部関数を作成します
  • "add" の場合、a + b を返します
  • "subtract" の場合、a - b を返します
  • "multiply" の場合、a * b を返します
  • "divide" の場合、b が 0 かどうかを確認し、真であれば error("Division by zero") を呼び出し、そうでなければ a / b を返します
  • その他の操作については、error("Invalid operation") を呼び出します
  • pcall() を使用して内部関数を実行します
  • 成功した場合は、"Result: " の後に結果を続けて返します
  • エラーが発生した場合は、"Error: " の後にエラーメッセージを続けて返します

パラメータ:

  • operation (string): 実行する操作 ("add", "subtract", "multiply", または "divide")
  • a (number): 最初のオペランド
  • b (number): 2番目のオペランド

戻り値: "Result: " の後に計算結果が続く文字列、または "Error: " の後にエラーメッセージ(文字列)が続く文字列

チートシート

pcall() 関数(保護された呼び出し)を使用すると、プログラムをクラッシュさせることなく、失敗する可能性のあるコードを安全に実行できます。

基本構文:

local status, result = pcall(functionName, arg1, arg2)

pcall() は2つの値を返します:

  • status: 関数が成功した場合は true、エラーが発生した場合は false
  • result: 成功した場合は関数の戻り値、エラーが発生した場合はエラーメッセージ

例:

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

これにより、クラッシュする代わりにエラーをキャッチし、プログラムを続行してエラーを適切に処理できるようになります。

自分で試してみよう

function safeCalculate(operation, a, b)
    -- ここにコードを書いてください
end
quiz icon腕試し

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

Logic & Flowのすべてのレッスン