我试图有一个函数来确保我需要的表已经创建,如果没有创建它。这是示例:
ensure_table_exists(Table, MnesiaTables, Nodes) ->
case lists:member(Table, MnesiaTables) of
true ->
throw({error, db_might_have_already_been_created});
false ->
mnesia:create_table(Table, [{disc_copies, Nodes},
{attributes, record_info(fields, Table)}]),
ok
end.
问题是编译时出现错误:illegal record info
。
可能必须在编译时解析 record_info 或者 record info 的第二个参数实际上应该是可以从源代码中检索的记录?
是的,所有记录相关things包括record_info/2
在编译时解决。这意味着记录和字段名称必须在编译时已知。这就是编译器错误的原因。
我不认为你的功能真的太具有防御性,因为你所做的只是发出更具体的错误信号。如果你这样做那就是另一回事了return {error, ...}
.
最后一点是,如果您想引发异常,则不应使用throw/1
但改为使用erlang:error/1
. throw
用于非本地返回(被捕获catch
) while erlang:error
旨在引发异常。在许多情况下,结果可能是相同的,但实际的误差值可能会产生误导(nocatch
)。你越清楚地表达你的意图总是越好,在这种情况下,这表明了一个错误。
附:是的,我know that catch
也捕获错误/退出。这是故意的。也许在一个完美的世界里catch
应该只捕获抛出并且try
只有错误/退出。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)