首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何让Dialyzer接受对故意抛出的函数的调用?

如何让Dialyzer接受对故意抛出的函数的调用?
EN

Stack Overflow用户
提问于 2021-01-15 20:08:59
回答 2查看 67关注 0票数 2

我有一个函数,当它的第一个参数是原子throw时,它会故意抛出。

此代码的简化版本为:

代码语言:javascript
运行
复制
-module(sample).

-export([main/1, throw_or_ok/1]).

main(_Args) ->
    throw_or_ok(throw).


throw_or_ok(Action) ->
    case Action of
        throw -> throw("throwing");
        ok -> ok
    end.

调用throw_or_ok时出现透析器错误

代码语言:javascript
运行
复制
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')

添加规范无济于事,错误消息是相同的:

代码语言:javascript
运行
复制
-module(sample).

-export([main/1, throw_or_ok/1]).

-spec main(_) -> no_return().
main(_Args) ->
    throw_or_ok(throw).

-spec throw_or_ok(throw) -> no_return(); (ok) -> ok.
throw_or_ok(Action) ->
    case Action of
        throw -> throw("throwing");
        ok -> ok
    end.

如何让Dialyzer接受保证抛出的对throw_or_ok/1的调用?

EN

回答 2

Stack Overflow用户

发布于 2021-01-27 18:08:32

不幸的是,目前还没有干净的方式来通过规格将其标记为可接受的透析器。

不过,也许您可以使用忽略警告注释。

票数 0
EN

Stack Overflow用户

发布于 2021-01-28 03:20:36

看起来如果放入throw,它将永远不会返回,如果放入ok,模式将永远不会与throw匹配。请参阅具有类似issue的主题。main/1的逻辑需要改变,例如:

代码语言:javascript
运行
复制
main(Args) ->
    MaybeOk = case Args of
        0 -> throw;
        _ -> ok
    end,
    throw_or_ok(MaybeOk).

代码语言:javascript
运行
复制
main(_Args) ->
    throw_or_ok(_Args).
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65735849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档