假设我有一个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
(其中并非所有回调函数都将被使用)的正确方法是什么?
答案 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行为。换句话说,您需要实现所有回调函数。
是否建议将日志记录添加到未使用的回调中 以便它们的无意使用会出现在日志中?
由您决定。对我来说,这听起来是个好主意。