`

[笔记]erlang的异常处理

 
阅读更多

erlang的异常处理没有什么太大的特别的

异常分为:

  • error
  • throw
  • exit(一般正常退出也用这个)

原来的做法是用catch:

1> catch 0.
0
2> catch throw(0).
0
3> catch a=b.
{'EXIT',{{badmatch,b},[{erl_eval,expr,3,[]}]}}
4> catch exit(0).
{'EXIT',0}

 从上到下分别是:

正常:直接输出

throw异常:直接输出异常原因

error(匹配错误):输出详细内容

exit:输出退出和退出原因

 

然后有一个例子 简单记一下:

-module(excep).
-export([ec_test/0]).

ec_test() ->
try
  %% throw("throw exception") %抛出一个异常
  %% 0                        %正常输出
  %% a=b                      %一个匹配错误
  exit(0)
of
  0 ->io:format("0~n");
  _ ->io:format("other~n")
catch
  throw:Case -> io:format("throw exception:~p~n",[Case]);
  error:Case -> io:format("error:~p~n",[Case]);
  exit:Case  -> io:format("exit:~p~n",[Case]) 
after
  io:format("program exit~n")
end.

 格式可以是:

  • try...catch...
  • try..of..catch
  • try...after,,,,
  • 或者以上的 try...of...catch...after

 

只有try那边抛出的异常才会被捕获到

of和catch出现异常不会被捕获

after无论如何都会被执行,如果after有异常那么他的异常会取代掉try中的异常

 

这边的格式也需要注意

最后一定会有个end说明结束了

但每一块中的最后一个语句是不用加符号的(不用写 ,(逗号) 或者 ;(分号))

 

也顺便说下我关于符号的理解吧

句号 . 表示结束(用于shell输入语句 或者函数结束等)

分号 ; 表示并列(用书case if 和同名函数的并列)

逗号 . 表示顺序执行(好像说的不太对 when的条件,语句等)

        $ 取对应字符的数值

        # 进制#数值 例如 2#0101(5).

 

其他的内容

erlang:get_stacktrace(). 获得异常堆栈

erlang:raise(错误类别,原因,堆栈). 用来再次抛出异常.

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics