Hatena::Grouperlang

檜山正幸のErlang未確認情報 RSSフィード

 | 

2009-03-31 (火)

関数の存在確認、例外のリスロー

| 10:09

「apply、アブネーー」の問題だが、そもそも関数の存在確認は次のようすべきだろう*1

is_defined(Mod, Fun, Arity) ->
  Exports = 
    try 
      apply(Mod, module_info, [exports])
    catch
      error:undef ->
        []
    end,
  case lists:keysearch(Fun, 1, Exports) of
    {value, {Fun, Arity}} ->
      true;
    _ ->
      false
  end.

それはそうとして、例外のリスローだが、次はダメ。

bad() ->
  1/0.

call_bad() ->
  try 
    bad()
  catch
    error:Term ->
      io:format("~p ~p~n~n", [Term, erlang::et_stacktrace()]),
      erlang:error(Term) % ここで新たなスタックトレース生成
  end.

call_call_bad() ->
  try 
    call_bad()
  catch
    error:Term ->
      io:format("~p ~p~n~n", [Term, erlang:get_stacktrace()])
  end.

erlang:raise/3は、第3引数スタックトレースを指定できるので、erlang:raise(error, Term, erlang:get_stacktrace()) とする。erlang:raise/3は、この目的以外で使うことはほとんどないだろう。無闇に使うと、スタックトレースを捏造することになり混乱を招く。

*1:R13からはlists:keyfind/3が推奨。

ValentinaValentina2012/08/24 18:51This piece was cogent, well-witrten, and pithy.

hzkiyhzhzkiyhz2012/08/25 15:48ulmEt6 <a href="http://gcoiyuwzcreu.com/">gcoiyuwzcreu</a>

kpyqduozykpyqduozy2012/08/27 00:13KrkVK3 <a href="http://dmuynnkjqulo.com/">dmuynnkjqulo</a>

dajugzudajugzu2012/08/27 22:29aIT0Zi , [url=http://jjbybzuabnzb.com/]jjbybzuabnzb[/url], [link=http://dffjjwepljnx.com/]dffjjwepljnx[/link], http://nbseayfagmif.com/

 |