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
,rescue
或catch
中的哪一个.
以上内容是否对您有帮助:
更多建议: