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: に基づいてトレースバックを構築します呼び出し拡張エラー メッセージ

>=xpcall(function(i) print(i) error('error..') end, function() print(debug.traceback()) end, 33) 33 スタックトレースバック: stdin:1: 機能中