Elixir 之后

2023-12-16 20:47 更新
在資源經(jīng)過某些有可能引發(fā)錯(cuò)誤的操作之后,我們需要確認(rèn)其已經(jīng)被清理干凈了.try/after結(jié)構(gòu)允許你這樣做.例如,我們可以打開一個(gè)文件然后使用一個(gè)after從句來關(guān)閉它--即使粗錯(cuò)了:
iex> {:ok, file} = File.open "sample", [:utf8, :write]
iex> try do
...>   IO.write file, "olá"
...>   raise "oops, something went wrong"
...> after
...>   File.close(file)
...> end
** (RuntimeError) oops, something went wrong

無論try塊中的代碼是否成功,after從句都會(huì)被執(zhí)行.然而,注意,如果一個(gè)鏈接進(jìn)程退出了,那么這個(gè)進(jìn)程會(huì)立刻退出而且不會(huì)執(zhí)行after從句.因此after只提供了一個(gè)軟保險(xiǎn).幸運(yùn)的是,Elixir中的文件也鏈接到了當(dāng)前進(jìn)程,所以當(dāng)前進(jìn)程崩潰時(shí)它們總會(huì)被關(guān)閉,這是獨(dú)立于after從句的.你會(huì)發(fā)現(xiàn)對(duì)于其他資源例如ETS表,套接字,端口等等也是成立的.

有時(shí)你會(huì)想要將整個(gè)函數(shù)包裹在try結(jié)構(gòu)內(nèi),通常是為了保證這些代碼在之后能被執(zhí)行.這時(shí),Elixir允許你省略try這一行:

iex> defmodule RunAfter do
...>   def without_even_trying do
...>     raise "oops"
...>   after
...>     IO.puts "cleaning up!"
...>   end
...> end
iex> RunAfter.without_even_trying
cleaning up!
** (RuntimeError) oops

Elixir會(huì)自動(dòng)將函數(shù)體包裹到try里,無論選擇after,rescuecatch中的哪一個(gè).


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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)