Elixir 之后

2023-12-16 20:47 更新
在資源經過某些有可能引發(fā)錯誤的操作之后,我們需要確認其已經被清理干凈了.try/after結構允許你這樣做.例如,我們可以打開一個文件然后使用一個after從句來關閉它--即使粗錯了:
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從句都會被執(zhí)行.然而,注意,如果一個鏈接進程退出了,那么這個進程會立刻退出而且不會執(zhí)行after從句.因此after只提供了一個軟保險.幸運的是,Elixir中的文件也鏈接到了當前進程,所以當前進程崩潰時它們總會被關閉,這是獨立于after從句的.你會發(fā)現對于其他資源例如ETS表,套接字,端口等等也是成立的.

有時你會想要將整個函數包裹在try結構內,通常是為了保證這些代碼在之后能被執(zhí)行.這時,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會自動將函數體包裹到try里,無論選擇after,rescuecatch中的哪一個.


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號