Lua:
エラー処理

方法:

Luaはエラー処理のために主に2つの関数pcallxpcallを使用します。以下がその使い方です:

function might_fail()
    if math.random() > 0.5 then
        error("おっと!問題が発生しました。")
    else
        print("問題なし!")
    end
end

-- pcallを使用する
local success, errorMessage = pcall(might_fail)

if success then
    print("成功!")
else
    print("エラーを捕捉:", errorMessage)
end

-- エラーハンドラと共にxpcallを使用する
function myErrorHandler(err)
    print("エラーハンドラ:", err)
end

local status = xpcall(might_fail, myErrorHandler)
print("呼び出しは成功しましたか?", status)

サンプル出力は以下のようになります:

エラーを捕捉: おっと!問題が発生しました。
エラーハンドラ: おっと!問題が発生しました。
呼び出しは成功しましたか? false

エラーが発生しなかった場合は:

問題なし!
成功!
問題なし!
呼び出しは成功しましたか? true

詳細解説

エラー処理、または「例外処理」とは、常にあったわけではありません。初期のプログラムはよくクラッシュしました。コーディングが進化するにつれて、安定性へのニーズも高まりました。Luaのアプローチは他の言語と比べてシンプルです。try/catch ブロックはありませんが、pcallxpcall があります。前者は関数呼び出しを保護し、状態とエラーを返します。後者はエラー処理関数を追加し、カスタムのクリーンアップやログに便利です。

Luaでの別の選択肢は assert を使用することです。これは条件が偽の場合にエラーを投げることで似た目的を果たしますが、複雑なエラー処理シナリオに対して pcall ほど柔軟ではありません。

内部的に、pcallxpcall は関数が実行される「保護された環境」を設定することによって動作します。エラーが発生すると、環境がそれを捕捉し、直ちに処理するか、プログラムが処理するために渡すことができます。

関連項目

  • 「Programming in Lua」(第3版) の書籍は、エラー処理に関する詳細な情報が必要な場合は https://www.lua.org/pil/ で入手可能です(8.4節)。
  • 公式のLua 5.4リファレンスマニュアル: https://www.lua.org/manual/5.4/ - Luaのエラー処理関数に関する最新情報についてです。
  • Luaユーザーコミュニティのウィキのエラー処理: http://lua-users.org/wiki/ErrorHandling – コミュニティの見解やパターンについてです。