我一直在試圖弄清楚如何在調用進程B中捕獲或救援另一個進程A中的錯誤,該進程也殺死了進程A.如何通過在Elixir中調用進程來捕獲或救援被調用進程的崩潰錯誤
這裏是我的代碼:
defmodule A do
def start_link do
GenServer.start_link(__MODULE__, :ok, name: :A)
end
def fun(fun_loving_person) do
GenServer.call(fun_loving_person, :have_fun)
end
def init(:ok) do
{:ok, %{}}
end
def handle_call(:have_fun, _from, state) do
raise "TooMuchFun"
{:reply, :ok, state}
end
end
defmodule B do
def start_link do
GenServer.start_link(__MODULE__, :ok, name: :B)
end
def spread_fun(fun_seeker) do
GenServer.call(:B, {:spread_fun, fun_seeker})
end
def init(:ok) do
{:ok, %{}}
end
def handle_call({:spread_fun, fun_seeker}, _from, state) do
result = A.fun(fun_seeker)
{:reply, result, state}
rescue
RuntimeError -> IO.puts "Too much fun rescued"
{:reply, :error, state}
end
end
{:ok, a} = A.start_link
{:ok, _b} = B.start_link
result = B.spread_fun(a)
IO.puts "#{inspect result}"
在模塊B的handle_call
功能,我叫模塊A的功能,它在任何情況下塊rescue
出現錯誤與過程:A
。錯誤提出,但rescue
塊未得到執行。
我是否錯過了對一個進程崩潰如何影響另一個的基本理解?只有當錯誤發生在同一過程中時,才嘗試/趕上或嘗試/解救工作?我是否必須監視其他進程並將其退出?
我會感謝您的幫助。
謝謝。所以如果我理解你,拋出/拋出錯誤和捕獲/救出它必須發生在同一個過程中? –
是的,必須在同一個進程代碼 – Pouriya