codecamp

Elixir 之后

在资源经过某些有可能引发错误的操作之后,我们需要确认其已经被清理干净了.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中的哪一个.


Elixir 退出
Elixir 变量域
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

Elixir 基本操作符

Elixir 二进制,字符串和字符列表

Elixir 类型规格与行为

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }