Erlang 如何让透析器接受对故意抛出的函数的调用?

Erlang 如何让透析器接受对故意抛出的函数的调用?,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

我有一个函数,当它的第一个参数是atom
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参数)。