*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
}}


トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS