gpt4 book ai didi

erlang mnesia - 非法记录信息

转载 作者:行者123 更新时间:2023-12-04 18:52:45 24 4
gpt4 key购买 nike

我试图有一个函数来确保我需要的表已经创建,如果没有创建它。这是示例:

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/2在编译时解决。这意味着在编译时必须知道记录和字段名称。这就是编译器错误的原因。

我不认为您的功能真的太具有防御性,因为您正在做的是发出更具体的错误信号。如果你要那就另当别论了返回 {error, ...} .

最后一点是,如果您想引发异常,则不应使用 throw/1而是使用 erlang:error/1 . throw用于非本地返回(被 catch 捕获)而 erlang:error旨在引发异常。在许多情况下,结果可能相同,但实际错误值可能具有误导性 ( nocatch )。您能更清楚地表明您的意图总是更好,在这种情况下,这是一个错误信号。

附言是的,我知道 那个catch还可以捕获错误/退出。这是故意的。在一个完美的世界里也许 catch应该只 catch 和 try只有错误/退出。

关于erlang mnesia - 非法记录信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3685035/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com