Erlang 如何让透析器接受对故意抛出的函数的调用?
我有一个函数,当它的第一个参数是atomErlang 如何让透析器接受对故意抛出的函数的调用?,erlang,dialyzer,Erlang,Dialyzer,我有一个函数,当它的第一个参数是atomthrow时,它会故意抛出 此代码的简化版本为: -模块(示例)。 -导出([main/1,throw\u或\u ok/1])。 main(_Args)-> 扔_或_ok(扔)。 抛出或确认(动作)-> 案例诉讼 投掷->投掷(“投掷”); 确定->确定 结束。 呼叫throw\u或\u ok时出现透析器错误: sample.erl:7: The call sample:throw_or_ok ('throw') will never
throw
时,它会故意抛出
此代码的简化版本为:
-模块(示例)。
-导出([main/1,throw\u或\u ok/1])。
main(_Args)->
扔_或_ok(扔)。
抛出或确认(动作)->
案例诉讼
投掷->投掷(“投掷”);
确定->确定
结束。
呼叫throw\u或\u ok
时出现透析器错误:
sample.erl:7: The call sample:throw_or_ok
('throw') will never return since it differs in the 1st argument from the success typing arguments:
('ok')
添加规格没有帮助,错误消息相同:
-模块(示例)。
-导出([main/1,throw\u或\u ok/1])。
-spec main()->no_return()。
main(_Args)->
扔_或_ok(扔)。
-spec throw_或_ok(throw)->no_return();(好)->好。
抛出或确认(动作)->
案例诉讼
投掷->投掷(“投掷”);
确定->确定
结束。
如何让透析器接受保证会抛出的呼叫
throw\u或\u ok/1
。不幸的是,目前没有干净的方法通过规范将其标记为透析器可接受
但是,也许您可以使用忽略警告注释。看起来,如果将放置
抛出它将永远不会返回,如果将放置确定
则模式将永远不会与抛出
匹配。请参阅具有类似内容的主题。main/1
的逻辑需要更改,例如:
main(Args)->
MaybeOk=的案例参数
0->投掷;
_->好的
完,,
抛出或确定(可能确定)。
或
main(_Args)->
抛出\u或\u ok(\u参数)。