[笔记]erlang的异常处理
erlang的异常处理没有什么太大的特别的
异常分为:
errorthrowexit(一般正常退出也用这个)原来的做法是用catch:
1> catch 0.02> catch throw(0).03> 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..catchtry...after,,,,或者以上的 try...of...catch...after?
只有try那边抛出的异常才会被捕获到
of和catch出现异常不会被捕获
after无论如何都会被执行,如果after有异常那么他的异常会取代掉try中的异常
?
这边的格式也需要注意
最后一定会有个end说明结束了
但每一块中的最后一个语句是不用加符号的(不用写 ,(逗号) 或者 ;(分号))
?
也顺便说下我关于符号的理解吧
句号 . 表示结束(用于shell输入语句 或者函数结束等)
分号 ; 表示并列(用书case if 和同名函数的并列)
逗号 . 表示顺序执行(好像说的不太对 when的条件,语句等)
? ? ? ? $ 取对应字符的数值
? ? ? ? # 进制#数值 例如 2#0101(5).
?
其他的内容
erlang:get_stacktrace(). 获得异常堆栈
erlang:raise(错误类别,原因,堆栈). 用来再次抛出异常.