2014-02-12 30 views
0

时后,我看了看this question,我相信我百思不得其解,除了以下:二郎尝试 - 追赶 - 读取文件

try get_all_lines(Device) 
    after file:close(Device) 
end. 

寻找在documentation,特别是7.19试试部分,看起来好像通常使用after子句作为故障安全块来执行,而不管是否执行条件块。如果这是一个正确的假设,为什么给出的示例使用after时,不仅没有条件块,根本就没有块!它看起来像try get_all_lines(Device)块是完全空的,并且附加了不必要的after子句。我误解了这个例子,还是这个代码可以写的更好?

回答

1

该块不是空的,它包含一个函数调用:get_all_lines(Device)。如果io:get_line在这个函数内部抛出一个异常(例如,因为该文件在读取时被删除,那么get_all_lines也会抛出,并且在这种情况下以及函数无异常返回时都需要关闭文件。 after是为了

+0

理解这段代码的重要之处在于“after”的返回值丢失了,整个表达式的结果与'try get_all_lines(Device)'的结果相同,这有点奇怪,在erlang中的用法,但在文档[reference_manual/expressions](http://www.erlang.org/doc/reference_manual/expressions.html#id79430)中有明确说明。 – Pascal