% (1).file:read_file(File) 会返回 {ok, Bin} 或者 {error, Why},
% 其中 File 是文件名, Bin 则包含了文件的内容。请编写一个
% myfile:read(File) 函数,当文件可读取时返回 Bin,否则抛出
% 一个异常。
-module(myfile).
-export([read/1]).
read(File) ->
try file:read_file(File) of
{ok, Content} -> Content;
{error, Reason} -> throw(Reason)
catch
throw:X -> io:format("throw Reason is:~p~n", [X]);
error:X -> io:format("error Reason is:~p~n", [X]);
exit:X -> io:format("exit Reason is:~p~n", [X])
end.
这段当我输入一个 不存在的文件 和 不可读的文件 时,异常都没有被我写的catch
捕获,而是被系统捕获了。题目并没有要求捕获,正确的去掉 catch
后就好。
% 重写 try_test.erl 里的代码,让它生成两条错误消息;
% 一条明文消息给用户,另一条详细的消息给开发者。
-module(try_test).
-export([generate_exception/1, demo1/0, catcher/1]).
generate_exception(1) -> a;
generate_exception(2) -> throw(a);
generate_exception(3) -> exit(a);
generate_exception(4) -> {'EXIT', a};
generate_exception(5) -> error(a).
demo1() ->
[catcher(I) || I <- [1,2,3,4,5]].
catcher(N) ->
try generate_exception(N) of
Val -> {N, normal, Val}
catch
throw:X -> {user, N, caught, thrown, X},
{developer, X, erlang:get_stacktrace()};
exit:X -> {user, N, caught, exited, X},
{developer, X, erlang:get_stacktrace()};
error:X -> {user, N, caught, error, X},
{developer, X, erlang:get_stacktrace()}
end.
erlang:get_stacktrace
打印详细的函数调用栈,可以很好的让开发者判断错误发生时程序执行的位置。对于普通用户,简单回复错误内容或警告即可。
erlang程序中,当系统内部或程序逻辑检测出错时,正确的做法是立即崩溃并生成一段有意义的错误消息。立即崩溃是不让事情变得更糟。错误消息应追求详细且写到永久化的错误日志里。