LUAチュートリアルエラー-32


Errare humanum est(ラテンのことわざ:過ちを犯すのは人間の本性だ).だから私たちはできるだけ誤りの発生を防止しなければならなくて、Luaはいつも拡張言語として他の応用の中で埋め込んで、だから誤りが発生する時簡単な崩壊あるいは退出することができません.逆に、エラーが発生した場合、Luaは現在のchunkを終了し、アプリケーションに戻る.
Luaが望ましくない状況に遭遇すると、エラーが投げ出されます.例えば、2つの非数値が加算されます.非関数の変数を呼び出します.テーブルに存在しない値などにアクセスします(metatablesでこの動作を変更できます.後述します).エラー関数を呼び出すことで、エラーを明示的に投げ出すこともできます.エラーのパラメータは投げ出すエラー情報です.
print "enter a number:"
n = io.read("*number")
if not n then error("invalid input") end

Luaは、上記のような機能を達成するために、専用の組み込み関数assertを提供しています.
print "enter a number:"
n = assert(io.read("*number"), "invalid input")

assertはまず最初のパラメータをチェックし、問題がなければ、assertは何もしません.そうでない場合、assertは2番目のパラメータをエラー情報として放出します.2番目のパラメータはオプションです.注意:assertは、2つのパラメータを最初に処理してから関数を呼び出すので、nが数値であるかどうかにかかわらず、文字列接続操作は常に実行されます.
n = io.read()
assert(tonumber(n), "invalid input: " .. n .. " is not a number")

関数が異常に遭遇した場合、エラーコードを返すか、エラーを投げ出すかの2つの基本的な動作があります.どちらの方式を選択するかは、固定的なルールはありませんが、基本的な原則は、プログラム論理上避けられる異常に対して、エラーを投げ出すように処理し、そうでなければエラーコードを返すことです.たとえばsin関数では、sinがエラーに遭遇したときにエラーコードを返すと仮定すると、sinを使用するコードは次のようになります.
local res = math.sin(x)
if not res then      -- error
    ...

もちろんsinを呼び出す前にxが数値であるかどうかを確認することもできます.
if not tonumber(x) then     -- error: x is not a number
    ...

実際には、パラメータのチェックでも結果のチェックでもありません.パラメータエラーは、プログラムのどこかに問題があることを意味する可能性があります.この場合、異常を処理する最も簡単な最も現実的な方法は、エラーを投げ出し、コードの実行を終了することです.
もう一つ例を見てみましょう.io.Open関数はファイルを開くために使用されます.ファイルが存在しない場合、結果はどうなりますか?多くのシステムでは、「ファイルを開いてみる」ことで、ファイルが存在するかどうかを判断します.だからio.Openはファイルを開くことができません(ファイルが存在しないか、権限がないため)、関数はnilとエラー情報を返します.このようにして、ユーザーとインタラクティブに(たとえば、別のファイルを開くかどうか)問題を合理的に処理することができます.
local file, msg
repeat
 
    print "enter a file name:"
 
    local name = io.read()
 
    if not name then return end     -- no input
 
    file, msg = io.open(name, "r")
 
    if not file then print(msg) end
 
until file

これらの状況を処理したくない場合や、コードの安全な実行をしたい場合は、assertを使用します.
file = assert(io.open(name, "r"))

Luaにはio.Openに失敗すると、assertはエラーを投げ出します.
file = assert(io.open("no-file", "r"))
       --> stdin:1: no-file: No such file or directory

注意:io.Openが返す2番目の結果(エラー情報)はassertの2番目のパラメータとして使用されます.
 
译文:LUAは、コンパクトなスクリプト言語学習ノート
LUAチュートリアルエラー-32