如何不执行行为回调函数?

时间:2019-05-21 05:12:20

标签: erlang behavior otp gen-server

假设我有一个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(其中并非所有回调函数都将被使用)的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

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

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.

答案 1 :(得分:1)

  

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

然后您的服务器不是gen_server,因此您可以删除以下行:

-behavior(gen_server).

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

最重要的是,OTP需要您的代码与OTP行为之间的契约。如果您不想遵守合同,则不能使用OTP行为。换句话说,您需要实现所有回调函数。

  

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

由您决定。对我来说,这听起来是个好主意。