erlang 警告:未定义的回调函数终止/3(行为'gen_statem')**

s3fp2yjn  于 2022-12-08  发布在  Erlang
关注(0)|答案(2)|浏览(170)

这个警告有多严重?我可以使用这个警告模块吗?这个警告的副作用是什么?
警告:未定义的回调函数终止/3(行为'gen_statem')**

Erlang/OTP: 19.0.7

 
git clone https://github.com/inaka/apns4erl.git
cd apns4erl/
wget https://s3.amazonaws.com/rebar3/rebar3 && chmod +x rebar3
./rebar3 compile
===> Fetching coveralls v2.2.0
===> Fetching jsx v2.10.0
===> Analyzing applications...
===> Compiling jsx
===> Compiling coveralls
===> Verifying dependencies...
===> Fetching base64url v1.0.1
===> Fetching gun v1.3.3
===> Fetching jsx v3.0.0
===> Fetching cowlib v2.7.3
===> Analyzing applications...
===> Compiling cowlib
===> Compiling base64url
===> Compiling gun
===> Compiling jsx
===> Analyzing applications...
===> Compiling apns
**src/apns_connection.erl:22: Warning: undefined callback function terminate/3 (behaviour 'gen_statem')**
xn1cxnb4

xn1cxnb41#

此警告有多严重?
应该定义的函数不存在。
我是否可以使用带有此警告的模块?
主管使用terminate()函数在必要时关闭子进程。如果子进程从不需要关闭,那么你就很好。
您可以将不执行任何操作的终止函数添加到源代码中:

terminate(_Reason, _State, _Data) -> ok.

但是,一个更好的选择可能是向github存储库报告错误,希望他们能对代码进行快速修复。
或者,您可以尝试升级您的erlang版本。在较新的erlang版本中,terminate()函数是自动为您定义的。
这个警告的副作用是什么。
程序在某个时候崩溃。

mm9b1k5b

mm9b1k5b2#

在Erlang/OTP 19.3和更高版本中,由于this changeterminate/3回调对于gen_statem是可选的。如文档中所述:
此回调是可选的,因此回调模块不需要将其导出。gen_statem模块提供了一个默认实现,无需清除。
因此,让我们来看看在早期版本中不包含此函数的后果。根据文档,terminate函数将在三种不同的情况下被调用:

  • 另一个回调函数返回了Actions中的停止元组{stop,Reason}
  • gen_statem是监督树的一部分,由其Supervisor命令终止(仅当gen_statem已设置为捕获退出信号,并且关闭策略不是brutal_kill时)
  • 进程从其父进程接收X1 M5 N1 X消息

当然,可以想象,对于一个特定的gen_statem,这些情况都不会发生,因此缺少terminate函数不会产生负面后果。在最坏的情况下,terminate函数会在进程即将退出时被调用,从而以不同于原始退出原因的退出原因终止进程,隐藏原始问题的原因。

相关问题