Lua:
エラー処理
方法:
Luaはエラー処理のために主に2つの関数pcall
とxpcall
を使用します。以下がその使い方です:
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
ブロックはありませんが、pcall
と xpcall
があります。前者は関数呼び出しを保護し、状態とエラーを返します。後者はエラー処理関数を追加し、カスタムのクリーンアップやログに便利です。
Luaでの別の選択肢は assert
を使用することです。これは条件が偽の場合にエラーを投げることで似た目的を果たしますが、複雑なエラー処理シナリオに対して pcall
ほど柔軟ではありません。
内部的に、pcall
と xpcall
は関数が実行される「保護された環境」を設定することによって動作します。エラーが発生すると、環境がそれを捕捉し、直ちに処理するか、プログラムが処理するために渡すことができます。
関連項目
- 「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 – コミュニティの見解やパターンについてです。