Lua-error-handling
Lua-エラー処理
エラー処理の必要性
実際の操作では、ファイル操作、データベーストランザクション、Webサービス呼び出しなどの複雑な操作が必要になることが多いため、エラー処理は非常に重要です。
どのプログラミングでも、エラー処理には常に要件があります。 エラーには次の2種類があります。
- 構文エラー *実行時エラー
構文エラー
演算子や式などのさまざまなプログラムコンポーネントの不適切な使用により、構文エラーが発生します。 構文エラーの簡単な例を以下に示します。
a == 2
ご存知のように、単一の「等しい」と二重の「等しい」の使用には違いがあります。 他の代わりに一方を使用すると、エラーが発生する可能性があります。 1つの「等しい」は割り当てを指し、二重の「等しい」は比較を指します。 同様に、定義済みの実装方法を持つ式と関数があります。
構文エラーの別の例を以下に示します-
for a= 1,10
print(a)
end
上記のプログラムを実行すると、次の出力が得られます-
lua: test2.lua:2: 'do' expected near 'print'
Luaインタープリターはランタイムエラーの場合よりも明確にエラーを特定するため、構文エラーはランタイムエラーよりもはるかに簡単に処理できます。 上記のエラーから、Luaの構造に従って、printステートメントの前に_do_ステートメントを追加する必要があることが簡単にわかります。
実行時エラー
実行時エラーが発生した場合、プログラムは正常に実行されますが、入力の誤りや誤った機能の処理により実行時エラーが発生する可能性があります。 実行時エラーを示す簡単な例を以下に示します。
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]: ?
これは、2つの変数を渡さないために発生したランタイムエラーです。* b *パラメータが必要ですが、ここではnilであり、エラーを生成します。
アサートおよびエラー関数
エラーを処理するために、 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: test2.lua:3: b is not a number
stack traceback:
[C]: in function 'assert'
test2.lua:3: in function 'add'
test2.lua:6: in main chunk
[C]: ?
- error(message [、level])*は、最後に呼び出された保護された関数を終了し、エラーメッセージとしてメッセージを返します。 この関数エラーは戻りません。 通常、errorは、メッセージの先頭にエラー位置に関する情報を追加します。 level引数は、エラー位置を取得する方法を指定します。 レベル1(デフォルト)では、エラー位置はエラー関数が呼び出された場所です。 レベル2は、エラーを呼び出した関数が呼び出された場所をエラーに示します。等々。 レベル0を渡すと、エラー位置情報がメッセージに追加されなくなります。
pcallおよびxpcall
Luaプログラミングでは、これらのエラーのスローおよびエラー処理を回避するために、関数pcallまたはxpcallを使用する必要があります。
- pcall(f、arg1、…)*関数は、保護モードで要求された関数を呼び出します。 関数fでエラーが発生した場合、エラーはスローされません。 エラーのステータスを返すだけです。 pcallを使用した簡単な例を以下に示します。
function myfunction ()
n = n/nil
end
if pcall(myfunction) then
print("Success")
else
print("Failure")
end
上記のプログラムを実行すると、次の出力が得られます。
Failure
- xpcall(f、err)*関数は、要求された関数を呼び出し、エラーハンドラーを設定します。 f内のエラーは伝播されません。代わりに、xpcallはエラーをキャッチし、元のエラーオブジェクトを使用してerr関数を呼び出し、ステータスコードを返します。
xpcallの簡単な例を以下に示します。
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
プログラマーとしては、作成するプログラムの適切なエラー処理を確実に行うことが最も重要です。 エラー処理を使用すると、プログラムのユーザーに影響を与えることなく、境界条件を超える予期しない条件を確実に処理できます。