Elixir 之后

2023-12-16 20:47 更新
在资源经过某些有可能引发错误的操作之后,我们需要确认其已经被清理干净了.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从句都会被执行.然而,注意,如果一个链接进程退出了,那么这个进程会立刻退出而且不会执行after从句.因此after只提供了一个软保险.幸运的是,Elixir中的文件也链接到了当前进程,所以当前进程崩溃时它们总会被关闭,这是独立于after从句的.你会发现对于其他资源例如ETS表,套接字,端口等等也是成立的.

有时你会想要将整个函数包裹在try结构内,通常是为了保证这些代码在之后能被执行.这时,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

公众号
微信公众号

编程狮公众号