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(错误类别,原因,堆栈). 用来再次抛出异常.