Random death

Erlang can be used to construct very robust systems that can handle and recover from unexpected errors. In order to test some of these features we need a way to introduce random errors.

death:gamble/1

The module module-8/src/death.erl exports a single function death:gamble(P) that will terminate the calling process with probability 0.0 ≤ P ≤ 1.0 using exit reason random_death.

Start an Erlang shell

In the terminal, navigate to the directory module-8/src.

$ cd module-8/src

Start an Erlang shell.

$ erl

You should now see the Erlang shell starting.

Erlang/OTP 20 [erts-9.2] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:10] [kernel-poll:false]

Eshell V9.2  (abort with ^G)
erlang>

Compile

Compile the death.erl module. Don’t forget end the expression with a trailing . (dot).

erlang> c(death).

On success you now should see the following in the Erlang shell.

{ok, death}
erlang>

Gamble with death

Call the gamble/1 function with argument 1.0.

erlang> death:gamble(1.0).

The Erlang shell terminates with reason random_death and is automatically restarted.

** exception exit: random_death
     in function  death:gamble/1 (death.erl, line 34)
erlang>

Call the gamble/1 function with argument 0.0.

erlang> death:gamble(0.0).

With death probability 0.0 the shell process will never be terminated, instead the gamble/1 functions returns the atom ok.

ok
erlang>

Experiment with other values for the death probability. For invalid values for the death probability, for example 2.0 you will get the following error message.

** exception error: no function clause matching death:gamble(1.1) (death.erl, line 31)