Luaエラー処理
Lua Error Handling
- 著者:ヤンメンゲ
- 校正:Yan Shuqing
プログラム実行中のエラー処理が必要であり、ファイル操作、データ転送、およびWebサービス呼び出し中に予期しないエラーが発生する可能性があります。エラー情報の処理に注意を払わないと、情報漏えいやプログラムの実行不能などの原因になります。
エラー処理は、どのプログラミング言語でも必要です。エラーの種類は次のとおりです。
- 文法エラー
- 実行エラー
文法エラー
構文エラーは通常、演算子や式などのプログラムのコンポーネントの不適切な使用によって引き起こされます。簡単な例は次のとおりです。
-- test.lua file a == 2
上記のコード実行結果は次のとおりです。
lua: test.lua:2: syntax error near '=='
ご覧のとおり、上記の構文エラーがあり、「=」記号は2つの「=」記号とは異なります。 '='は代入式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 is not a number') Assert(type(b) == 'number', 'b is not a number') return a+b end add(10)
上記のプログラムを実行すると、次のエラーが発生します。
Lua: test.lua:3: b is not a number stack traceback: [C]: in function 'assert' test.lua:3: in local 'add' test.lua:6: in main chunk [C]: in ?
この例では、assertは最初に最初の引数をチェックします。問題がない場合、assertはそれ以外のことは何もしません。assertは2番目の引数をエラーメッセージとしてスローします。
エラー関数
構文形式:
error (message [, level])
関数:実行中の関数を終了し、メッセージの内容をエラーメッセージとして返します(エラー関数は返されません)
通常、errorは、エラーの場所情報をメッセージヘッダーに追加します。
Levelパラメーターは、エラーが取得された場所を示します。
- Level = 1 [デフォルト]:エラー位置(ファイル+行番号)を呼び出す
- Level = 2:エラーを呼び出す関数のどの関数を示します
- レベル= 0:間違った位置情報を追加しないでください
Pcallおよびxpcall、デバッグ
Luaでエラーを処理するには、関数pcall(protected call)を使用して、実行する必要のあるコードをラップします。
Pcallは、後者に渡される関数と引数を受け取り、実行の結果を実行します:エラー、エラーなしの戻り値trueまたはfalse、errorinfo。
構文は次のとおりです
if pcall(function_name, ….) then -- no errors else -- some mistakes end
簡単な例:
> =pcall(function(i) print(i) end, 33) 33 true > =pcall(function(i) print(i) error('error..') end, 33) 33 false stdin:1: error..
> 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:呼び出しに基づいて拡張エラーメッセージを作成します
>=xpcall(function(i) print(i) error('error..') end, function() print(debug.traceback()) end, 33) 33 stack traceback: stdin:1: in function [C]: in function 'error' stdin:1: in function [C]: in function 'xpcall' stdin:1: in main chunk [C]: in ? false nil
Xpcallのユースケース2:
function myfunction () n = n/nil end function myerrorhandler( err ) print( 'ERROR:', err ) end status = xpcall( myfunction, myerrorhandler ) print( status)
上記のプログラムを実行すると、次のエラーが発生します。
ERROR: test2.lua:2: attempt to perform arithmetic on global 'n' (a nil value) false