Erlang-主管和gen_fsm上的异常退出

Erlang-主管和gen_fsm上的异常退出,erlang,otp,erlang-supervisor,gen-fsm,gen-event,Erlang,Otp,Erlang Supervisor,Gen Fsm,Gen Event,我有三个模块:calculadora,log\u calculadora和supervisor\u calculadoraCalculadora只是一个简单的计算器,它使用gen_fsm进行和、减、乘和除运算,并且supervisor执行supervisor行为。Calculadora运行良好,但当我尝试主管时,主管必须重新启动Calculadora模块,当您进行0/0分区或异常时,它不起作用。为什么? PD:模块log\u calculadora只是将我在calculadora中所做的操作写入

我有三个模块:
calculadora
log\u calculadora
supervisor\u calculadora
Calculadora
只是一个简单的计算器,它使用gen_fsm进行和、减、乘和除运算,并且supervisor执行supervisor行为。Calculadora运行良好,但当我尝试主管时,主管必须重新启动
Calculadora
模块,当您进行0/0分区或异常时,它不起作用。为什么?

PD:模块
log\u calculadora
只是将我在
calculadora
中所做的操作写入log.txt文件中。测试模块是给我异常退出的模块

加尔各拉多拉: 监督人: 测试模块 触发以下事件

 prop_calculadora() ->
    ?FORALL(Cmds, commands(?MODULE),
        begin
        supervisor_calculadora:start(),

在上面的代码中,我看到每个测试用例都启动了supervisor_calculadora(quickchecl?FORALL为每个Cmd执行块)。它将尝试启动管理器并使用相同的名称再次注册,但失败

您会遇到什么错误?正确:快速检查(calculadora_Supervisiada_statem:prop_calculadora())……**异常退出:关机如果您的主管在测试模块之外工作,您是否尝试过。我没有测试它,但是子规范看起来正确,fsm应该重新启动。错误表明模块calculadora_SupervisorAda_statem崩溃,这并不意味着supervisor+fsm没有完成他们的工作。如果没有关于property_statem行为、property.hrl和quickcheck函数的信息,就很难进一步了。我修复了它。谢谢你的评论。
-module(supervisor_calculadora).
-author("BreixoCF").

-behaviour(supervisor).

%% API
-export([start/0]).

%% Supervisor callbacks
-export([init/1]).

%%%===================================================================
%%% API functions
%%%===================================================================

start() ->
  supervisor:start_link({local, ?MODULE}, ?MODULE, []).

%%%===================================================================
%%% Supervisor callbacks
%%%===================================================================

init([]) ->
  RestartStrategy = one_for_one,
  MaxRestarts = 10,
  MaxSecondsBetweenRestarts = 5,
  Flags = {RestartStrategy, MaxRestarts, MaxSecondsBetweenRestarts},
  Restart = permanent,
  Shutdown = 2000,
  Type = worker,
  Calculadora = {calculadora, {calculadora, on, []},
  Restart, Shutdown, Type, [calculadora]},
  {ok, {Flags, [Calculadora]}}.
-module(calculadora_supervisada_statem).
-behaviour(proper_statem).

-include_lib("proper/include/proper.hrl").

%% CALLBACKS from proper_statem
-export([initial_state/0, command/1, precondition/2, postcondition/3, next_state/3]).
-export([suma/2, resta/2, producto/2, division/2]).
-export([acumular/1, modo/1]).

initial_state() ->
    {suma, 0}.

command(_S) ->
    frequency([{25, {call, ?MODULE, acumular, [number()]}},
           {20, {call, ?MODULE, modo, [modo()]}}]).

modo() ->
    elements([suma, resta, producto, division, unknown]).


next_state({division, _S}, _V, {call, ?MODULE, acumular, [0]}) ->
    {suma, 0};
next_state({Op,  S}, _V, {call, ?MODULE, acumular, [N]}) ->
    {Op, erlang:apply(?MODULE, Op, [S, N])};
next_state({_Op, _S}, _V, {call, ?MODULE, modo, [unknown]}) ->
    {suma, 0};
next_state({_Op,  S}, _V, {call, ?MODULE, modo, [NewOp]}) ->
    {NewOp, S};
next_state(S, _V, {call, _, _, _}) ->
    S.

precondition(_S, {call, _, _, _}) ->
    true.

postcondition({division, _S}, {call, ?MODULE, acumular, [0]}, {'EXIT',_}) ->
    true;
postcondition({Op, S}, {call, ?MODULE, acumular, [N]}, Res) ->
    Res == ?MODULE:Op(S, N);
postcondition({_Op, _S}, {call, ?MODULE, modo, [_NewOp]}, _Res) ->
    true;
postcondition(_S, {call, _, _, _}, _Res) ->
    false.



prop_calculadora() ->
    ?FORALL(Cmds, commands(?MODULE),
        begin
        supervisor_calculadora:start(),
        {H, S, Res} = run_commands(?MODULE,Cmds),
        cleanup(),
        ?WHENFAIL(io:format("History: ~p\nState: ~p\nRes: ~p\n", [H, S, Res]),
              aggregate(command_names(Cmds), Res == ok))
        end).



%%--------------------------------------------------------------------
%% Internal wrappers and auxiliary functions
%%--------------------------------------------------------------------

acumular(N) ->
    Acc = (catch calculadora:acumular(N)),
    timer:sleep(100),
    Acc.
modo(O) ->
    Acc = (catch calculadora:modo(O)),
    timer:sleep(100),
    Acc.
cleanup() ->
    catch calculadora:off(),
    timer:sleep(100).

suma(A, B) ->
    A + B.
resta(A, B) ->
    A - B.
producto(A, B) ->
    A * B.
division(_A, 0) ->
    0;
division(A, B) ->
    A / B.
proper:quickcheck(calculadora_supervisada_statem:prop_calculadora()).
 prop_calculadora() ->
    ?FORALL(Cmds, commands(?MODULE),
        begin
        supervisor_calculadora:start(),