Elixir 退出

2023-12-16 20:47 更新

進程中運行的所有Elixir代碼都會互相交流.當一個進程因"自然原因"(未處理的異常)死亡時,就會發(fā)送一個?exit?信號.直接發(fā)送一個退出信號也會讓進程死亡:

iex> spawn_link fn -> exit(1) end
#PID<0.56.0>
** (EXIT from #PID<0.56.0>) 1

上述例子中,鏈接的進程死了,是因為發(fā)送了一個值為1的?exit?信號.Elixir殼自動處理了這些信息并將其打印到終端.

?exit?也可以被?try/catch?"捕獲":

iex> try do
...>   exit "I am exiting"
...> catch
...>   :exit, _ -> "not really"
...> end
"not really"

使用?try/catch?已經(jīng)很不常見,用它來捕獲退出就更少見了.

?exit?信號是由Erlang VM提供的容錯系統(tǒng)中重要的部分.進程通常在監(jiān)督樹下運行,這些樹是自己處理的,只是等待來自監(jiān)督過程中的退出信號.一旦接收到了退出信號,監(jiān)督策略將啟動,并重啟監(jiān)督進程.

正是由于監(jiān)督系統(tǒng)的存在,使得?try/catch?與?try/rescue?結構在Elixir中如此少見.語氣解救一個錯誤,我們更愿意"快速失敗",因為監(jiān)督樹會保證我們的應用能夠在出錯之后回到一個已知的初始狀態(tài).


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號