无法捕捉错误条款

时间:2015-01-08 04:59:35

标签: erlang

我正在尝试读取文件,当发生任何错误时,它应匹配模式和返回值

我的代码看起来像

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>

为什么它没有捕获最通用的条款_:_

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}}错误。