Elixir 退出

2023-12-16 20:47 更新

進(jìn)程中運(yùn)行的所有Elixir代碼都會(huì)互相交流.當(dāng)一個(gè)進(jìn)程因"自然原因"(未處理的異常)死亡時(shí),就會(huì)發(fā)送一個(gè)?exit?信號(hào).直接發(fā)送一個(gè)退出信號(hào)也會(huì)讓進(jìn)程死亡:

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

上述例子中,鏈接的進(jìn)程死了,是因?yàn)榘l(fā)送了一個(gè)值為1的?exit?信號(hào).Elixir殼自動(dòng)處理了這些信息并將其打印到終端.

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

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

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

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

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


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)