Lua のエラー処理
プログラムの動作中にエラー処理が必要です。ファイル操作、データ転送、Webサービス呼び出し中に予期しないエラーが発生します。エラーメッセージの処理に注意しないと情報が漏洩し、プログラムが動作しなくなる可能性があります。
どのプログラミング言語でも、エラー処理は必要です。エラーの種類は次のとおりです:
構文エラー
実行時エラー
構文エラー
構文エラーは、通常、プログラム コンポーネント (演算子、式など) の不適切な使用によって発生します。簡単な例は次のとおりです。
-- test.lua 文件 a == 2
上記のコードの実行結果は次のとおりです。
lua: test.lua:2: syntax error near '=='
ご覧のとおり、上記の 1 つの "= 記号と 2 つの "= の間には構文エラーがあります。 「標識。 1 つの「=」は代入式、2 つの「=」は比較演算です。
別の例:
for a= 1,10 print(a) end
上記のプログラムを実行すると、次のエラーが発生します:
lua: test2.lua:2: 'do' expected near 'print'
構文エラーは、プログラムの実行エラーよりも単純ですが、上記と同様に、構文エラーはすぐに解決できます。例: for 文の下に do を追加するだけです:
for a= 1,10 do print(a) end
実行エラー
実行エラーとは、プログラムは正常に実行できるが、エラーメッセージが出力されることです。次の例では、パラメータの入力が間違っているため、プログラムの実行中にエラーが発生します。
function add(a,b) return a+b end add(10)
次のコードをコンパイルして実行すると、コンパイルは成功しますが、動作中に次のエラーが発生します。
lua: test2.lua:2: attempt to perform arithmetic on local 'b' (a nil value) stack traceback: test2.lua:2: in function 'add' test2.lua:5: in main chunk [C]: ?
次のエラー メッセージは、パラメーターによってプログラムに b が欠落していることが原因で発生します。
エラー処理
エラーを処理するには、assert と error という 2 つの関数を使用できます。例は次のとおりです。
local function add(a,b) assert(type(a) == "number", "a 不是一个数字") assert(type(b) == "number", "b 不是一个数字") return a+b end add(10)
上記のプログラムを実行すると、次のエラーが発生します。
lua: test.lua:3: b 不是一个数字 stack traceback: [C]: in function 'assert' test.lua:3: in local 'add' test.lua:6: in main chunk [C]: in ?
この例では、assert は最初のパラメータをチェックし、問題がなければ、assert は何も実行しません。 2 番目のパラメータはエラー メッセージとして表示されます。
error関数
構文形式:
error (message [, level])
関数: 実行中の関数を終了し、メッセージの内容をエラー情報として返します(error関数は決して戻りません)
通常、errorにはいくつかのエラー位置情報が追加されます。メッセージヘッダー。
Level パラメーターは、エラーが取得された場所を示します:
Level=1 [デフォルト]: エラーが呼び出される場所 (ファイル + 行番号)
Level=2: どのエラーが呼び出されるかを示す関数関数呼び出しエラー
-
Level=0: エラー位置情報を追加しないでください
pcall と xpcall、debug
Lua でエラーを処理するには、関数 pcall (保護された呼び出し) を使用してコードをラップします。実行する必要があります。
pcall は、関数と後者に渡されるパラメーターを受け取り、それを実行します。実行結果は、エラーまたはエラーなし、戻り値は true または false、errorinfo です。
構文形式は次のとおりです
if pcall(function_name, ….) then -- 没有错误 else -- 一些错误 end
簡単な例:
> =pcall(function(i) print(i) end, 33) 33 true > =pcall(function(i) print(i) error('error..') end, 33) 33 false stdin:1: error..<pここで、戻り値の論理的判断に注意してください:<p="">
> function f() return false,2 end > if f() then print '1' else print '0' end 0
pcallは「保護モード」で最初のパラメータを呼び出します" そのため、pcall は関数実行時のエラーをキャッチできます。
エラーが発生した場合、エラーが発生した場所だけでなく、より多くのデバッグ情報が必要になることがよくあります。しかし、pcall が戻ると、呼び出しスタックの一部が破壊されています。
Lua は xpcall 関数を提供します。xpcall は 2 番目のパラメーターであるエラー処理関数を受け取ります。エラーが発生すると、Lua は unwind を呼び出す前にエラー処理関数を呼び出すため、この関数をデバッグ ライブラリで使用して追加情報を取得できます。エラーについて。
デバッグ ライブラリは 2 つの一般的なエラー処理関数を提供します:debug.debug: ユーザーが拡散エラーの原因を見つけられるようにする Lua プロンプトを提供します
debug.traceback: に基づいてトレースバックを構築します呼び出し拡張エラー メッセージ