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