Lua-error-handling

提供:Dev Guides
移動先:案内検索

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であり、エラーを生成します。

アサートおよびエラー関数

エラーを処理するために、 asserterror の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

プログラマーとしては、作成するプログラムの適切なエラー処理を確実に行うことが最も重要です。 エラー処理を使用すると、プログラムのユーザーに影響を与えることなく、境界条件を超える予期しない条件を確実に処理できます。