【问题标题】:How to leave behavior callback functions unimplemented?如何不实现行为回调函数?
【发布时间】:2019-10-07 10:42:21
【问题描述】:

假设我有一个gen_server:

-module(myserver).
-behavior(gen_server).
-export([init/1, handle_call/3]).

init(Arg) -> % ...
handle_call(Request, From, State) -> % ...

编译它自然会产生警告:

myserver.erl:2: Warning: undefined callback function handle_cast/2 (behaviour 'gen_server')

如果我的服务器不需要handle_cast/2,我该如何处理这个警告?我是否定义一个占位符函数只是为了满足编译器?例如:

handle_cast(_Request, _State) -> unimplemented.

或者我是否忽略/抑制警告消息?

编写gen_server 的正确方法是什么,而不是使用所有回调函数?

【问题讨论】:

    标签: erlang behavior erlang-otp gen-server


    【解决方案1】:

    我们不应该忽略警告消息,这使我们以后很难跟踪应用程序中的错误/错误。保留占位符功能是一种更好的方法,但应该如下所示:

    handle_cast(_Msg, State) ->
        {noreply, State}.
    

    默认情况下,该函数不会向调用者提供数据,因此您或您的同事使用gen_sever:cast/2时可以避免应用程序崩溃。

    我没有具体的写法gen_sever。在我工作的一个大项目中,他们只是留下如下的占位符以供将来使用。他们不太关心是否使用回调函数。我们应该注意是否使用普通函数而不是回调函数。

    handle_call(_Request, _From, State) ->
        {reply, ok, State}.
    
    handle_cast(_Msg, State) ->
        {noreply, State}.
    
    handle_info(_Info, State) ->
        {noreply, State}.
    
    terminate(_Reason, _State) ->
        ok.
    

    【讨论】:

    • 是否建议将日志记录添加到本应未使用的回调函数中,以便它们的无意使用会出现在日志中?
    • 如果编译时这个警告不打扰你,那么就忽略它们。我只是想说你忽略cast 并留下这样的unimplemented。您将来可能需要cast
    【解决方案2】:

    如果我的服务器不需要,我该如何处理这个警告 handle_cast/2?

    那么您的服务器不是gen_server,因此您可以删除该行:

    -behavior(gen_server).
    

    这是导致编译器检查 gen_server 回调函数是否存在的原因。

    底线是 OTP 要求您的代码和 OTP 行为之间有一个契约。如果您不想遵守合同,那么您不能使用 OTP 行为。换句话说,您需要实现所有回调函数。

    是否建议将日志记录添加到假定未使用的回调中 功能,以便它们的无意使用会出现在日志中?

    这取决于你。对我来说这听起来是个好主意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-21
      • 2015-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多