*Luaリファレンス 要注意点 ~ASSERT 例外~ [#z693f38b] **assert [#f7fd992c] -第1引数がfalseかnilならエラーを返し、それ以外なら、値をそのまま返す。第2引数はメッセージ >~ C言語の場合は、~ #sh(cpp){{ #define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) ) }} とあるように値を返していないため、~ デバッグコンパイル時のエラーチェックぐらいにしかならないが、 ''luaでは、エラー時以外は値をそのまま返すのでステートメントの中に自然と含めて記載することが多い。'' ~ #sh(cpp){{ print "enter a number:" n = assert(io.read("*n"), "invalid input") }} **pcall [#fc5823c9] >''pcall''関数を使うことで、保護モードで関数の実行が可能である。~ (保護モード=エラーを補足するモード、try..catch的、どっちかといえば、Perlのevalの方が近そうだが…)~ この場合、「エラーが発生しなければ、返値の1番目が「true」」,「 発生したら1番目が「false」、2番目が「エラーメッセージ」」となる。~ trueの場合、返り値の2番目以降が元来の関数の返り値の1番目以降となる。~ #sh(cpp){{ function abc(x,y) return 1,2,3 end function cde(x,y) return 1 + "a" end print( pcall(abc, x, y) ) ---> true 1,2,3 print( pcall(cde, x, y) ) ---> false c:\function_a.lua:2: attempt to perform arithmetic on a string value }} > やろうと思えば以下のようなコードも可能だ #sh(cpp){{ pcall( function (x,y) return x+y end, 3,4 ) --> true 7 }} 返り値の1番目はステータスとも言えるので、以下のような記述も多い #sh(cpp){{ local status, arg1, arg2 = pcall ( function (x, y) return x, y end ) }} ~ **エラー表示 [#p468d650] -''error(message , level)'' >message … 文字列型~ level … 数値型(FIXNUM)~ >messageをエラーメッセージとして表示し、Luaスクリプトの実行を停止します。この関数は呼び出し元には戻りません。~ --levelでは、エラーの発生場所として表示する行番号を制御できます。~ --levelを省略した場合、あるいは1を与えた場合には、error関数を呼び出した行がエラーの発生場所となります。~ --2を与えた場合には、error関数を呼び出している関数を呼び出した行がエラーの発生場所となります。 --以降、3、4と値が増えるにつれ、関数の呼び出し関係が深くなっていきます。~ --0を与えると、エラーの発生行を表示しません。~ #sh(lua){{ function f1(x) f2(x) end function f2(x) f3(x) end function f3(x) f4(x) end function f4(x) if x == 1 then error("", 1) -- f4()でエラー elseif x == 2 then error("", 2) -- f3()でエラー elseif x == 3 then error("", 3) -- f2()でエラー elseif x == 4 then error("", 4) -- f1()でエラー else error("", 5) -- トップレベルでエラー end end }}