我正在尝试读取文件,当发生任何错误时,它应匹配模式和返回值
我的代码看起来像
read(File) ->
try file:read_file(File) of
{ok, Content} -> Content
catch
error:E -> {"Error reading", File, E};
_:_ -> {allError}
end.
当我跑步时,我看到了
1> file_read:read("/Users/harith/Downloads/er.txt").
<<"This file is read by erlang program\n">>
2> file_read:read("non-existent-file").
** exception error: no try clause matching {error,enoent}
in function file_read:read/1 (/Users/harith/code/IdeaProjects/others/erlang/programmingErlang/src/file_read.erl, line 16)
3>
为什么它没有捕获最通用的条款_:_
?
答案 0 :(得分:2)
仅仅因为file:read在文件不存在时不会发出异常,而是一个元组{error,Error}。这是有道理的,因为非现有文件是频繁的,最难以避免的。你可以写:
read(File) ->
case file:read_file(File) of
{ok, Content} -> Content;
{error,E} -> {"Error reading", File, E}
end. %% not very smart since read_file already does the job
答案 1 :(得分:1)
read_file(Filename) -> {ok, Binary} | {error, Reason}
请阅读文档:http://www.erlang.org/doc/man/file.html#read_file-1
{error,enoent}
是file:read_file(File)
的结果,你应该写一下:
case file:read_file(File) of
{ok, Content} -> Content;
{error:Error} -> {error: Error}
end
-module(wy).
-compile(export_all).
read_hlp(File) ->
try file:read_file(File) of
{ok, Content} -> Content
catch
error:E -> {"Error reading", File, E};
_:_ -> {allError}
end.
read(File) ->
try read_hlp(File) of
Res -> Res
catch
error:Error ->
Error
_:_ -> all_exception
end.
当您运行上面的代码时,您将获得{try_clause,{error,enoent}}
。
原因是:
函数read_hlp/1
中存在不匹配,因此异常将由被调用函数read/1
捕获。
答案 2 :(得分:1)
原因是match_clause
try
之后的of
错误发生在try
read(File) ->
try
{ok,Content} = file:read_file(File)
catch
error:E -> {"Error reading", File, E};
_:_ -> {allError}
end.
之后,file:read_file
错误发生在{error,Reason}
范围之外。最简单的方法是按照@Pascal建议或做:
badmatch
如果{{1}}无法读取该文件,则会返回{{1}},这将导致匹配失败,您将收到{{1}}错误。