Latest web development tutorials

Luaのエラー処理

プログラムの実行エラー処理は、予期しないエラーで表示されます私たちのファイル操作、データ転送とWebサービス呼び出しで、必要です。 あなたが漏洩する情報に応じて、エラーメッセージに対処するために注意を払っていない場合は、というように実行し、することはできません。

任意のプログラミング言語は、エラー処理が必要となります。 エラー・タイプは、次のとおりです。

  • 構文エラー
  • ランタイムエラー

構文エラー

構文エラーは、通常、不適切な使用によって引き起こされる(例えばオペレータ、表現など)、プログラムの構成要素によるものです。 次のように単純な例は次のとおりです。

-- test.lua 文件
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 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パラメータを欠いているので、次のエラーメッセージが発生します。


エラー処理

エラーを処理するためにアサートし、エラー:我々は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 ?

そうでない場合、スローされたエラーメッセージを主張するように、第2引数を、例を最初にチェックを最初の引数を主張し、問題ない場合は、何もしません主張しています。

誤差関数

構文:

error (message [, level])

:実行中の機能を終了し、エラーメッセージなどのメッセージの内容を返します(誤差関数を返すことはありません)

一般的に、エラーがヘッド位置にエラーメッセージに関するいくつかの追加情報となります。

Levelパラメータが間違って取得する位置を示しています。

  • レベル= 1 [デフォルト]:エラー(ファイル+行番号)を呼び出すには
  • レベル= 2:誤差関数を呼び出す関数は、示され
  • = 0レベル:エラーの場所を追加しないでください

PCALLとxpcall、デバッグ

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..
> function f() return false,2 end
> if f() then print '1' else print '0' end
0

最初の引数を呼び出すための「保護モード」でPCALLは、したがってPCALLキャプチャ機能は、すべてのエラーを実行することができます。

エラーが発生したときに典型的には、エラーが発生しただけの場合には、より多くのデバッグ情報で終わらないように望んでいます。 しかしPCALL戻ると、それはコール占の内容の一部を破壊しました。

Luaは二番目のパラメータの受信xpcall、xpcall機能を提供します - エラーが発生したときにエラーハンドラを、Luaのエラーハンドラは、Zhanのは(アンワインド)を参照することを示して呼び出す前に呼び出されます、あなたはデバッグライブラリでこの機能を使用することができますエラーに関する追加情報を取得します。

デバッグライブラリは、一般的な2つのエラーハンドラを提供します。

  • debug.debug:Luaは、ユーザーが間違った理由を広めるためにできるように、プロンプトを提供
  • debug.traceback:占によると、拡張エラーメッセージを構築するために呼び出します
> = Xpcall(関数(ⅰ)印刷(ⅰ)エラー(「エラー.. ')最後に、関数()印刷(debug.traceback())終わり、33)33スタックトレース:標準入力:1:関数内 [C]:関数の「エラー '標準入力:1:関数内 [C]:関数の「xpcall」標準入力:1:メインチャンク[C] :?偽は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