erlang中错误大体分为四种:
1. 编译错误
2. 逻辑错误
3. 运行时错误
4. 用户代码生成的错误
编译错误,主要是编译器检测出的代码语法错误
逻辑错误,是指程序没有完成预期的工作,属于开发人员的问题
运行时错误,是指erlang运行时抛出的错误,比如对非数据类型执行算术运算,erlang运行时会捕获异常,并抛出。在erlang中,这类异常的类型为error
用户自定义错误,是指通过exit/1或者throw/1生成
我们把运行时错误以及用户抛出的错误称为异常(exception),他们具有三种类型:throw, error, exit。
error型异常,通过erlang:error/1, 2生成,也可以使用早期的erlang:fault/1, 2
throw型异常,通过throw/1生成
exit型异常,通过exit/1生成
在erlang中,进程内的异常可以通过try, catch来进行捕获处理。
推荐使用try,其为新添加的语法。进程间的异常可以通过监督树(supervisor tree),监控进程(monitor)来实现。
badarg 参数错误,参数格式或类型错误
badarith 算术表达式错误,算术表达式中含有错误的参数
{badmatch,V} 模式匹配错误,V指具体的发生匹配错误的数值
function_clause 函数子句错误,没有找到匹配的函数子句
{case_clause,V} case匹配错误,没有找到匹配的case pattern
if_clause if子句错误,没有找到为ture的if子句
{try_clause,V} try匹配错误,执行try时,没有找到匹配的pattern
undef 函数未定义错误
{badfun,F} 函数错误
{badarity,F} 函数参数个数错误
timeout_value 超时参数错误,在receive.. after语法中,after对应的超时数据错误(应为不小于0的integer或infinity
noproc Process 错误,Process不存在
{nocatch,V} throw未被catch
system_limit 系统限制错误,某些性能或数据达到系统极限
try 语法
try Exprs [of
Pattern1 [when GuardSeq1] ->
Body1;
...;
PatternN [when GuardSeqN] ->
BodyN
catch
[Class1:]ExceptionPattern1 [when ExceptionGuardSeq1] ->
ExceptionBody1;
...;
[ClassN:]ExceptionPatternN [when ExceptionGuardSeqN] ->
ExceptionBodyN
end
如果try Exprs后没有of部分,则默认为Exprs的返回值。
如果在of部分或者catch部分,发生了异常,那么异常将不被处理,直接抛出。
下面的代码可以让你充分的学习,理解try语法。
test_try.erl 下载代码
-module(test_try).
-compile([export_all]).
-author('cheng litaocheng@gmail.com').
%% @spec test(F1, F2) -> Result
%% @doc evaluate the F , use the try to catch all kinds of error
%% F1 the Expression to be catch exception
%% F2 the Expression evaluate in the catch section
test(F1, F2) when (is_function(F1, 0) andalso is_function(F2, 0)) ->
try F1()
catch
throw:X ->
{{caught, throw, X}, F2()};
exit:X ->
{{caught, exit, X}, F2()};
error:X ->
{{caught, error, X}, F2()}
after
io:format("always evaluate the after body~n")
end.
运行:
21> c(test_try).
{ok,test_try}
22> test_try:test(fun() -> throw(hello) end, fun() -> ok end).
always evaluate the after body
{{caught,throw,hello},ok}
23> test_try:test(fun() -> exit(hello) end, fun() -> ok end).
always evaluate the after body
{{caught,exit,hello},ok}
24> test_try:test(fun() -> erlang:error(hello) end, fun() -> ok end).
always evaluate the after body
{{caught,error,hello},ok}
25> test_try:test(fun() -> erlang:error(hello) end, fun() -> throw(exception_in_catch) end).
always evaluate the after body
** exception throw: exception_in_catch
in function test_try:test/2
分享到:
相关推荐
erlang异常处理详解 开发经验: 面对软件错误构建可靠的分布式系统 编写分布式的 Erlang 程序:陷阱和对策 硝烟中的Erlang 深入底层: erlang VM基于多核处理器的可伸缩性特征 erlang VM内部数据共享机制 erlang ...
(494页带目录的高清扫描版) 这是一本讲解Erlang编程语言的入门指南,内容通俗...内容涉及模块、函数、类型、递归、错误和异常、常用数据结构、并行编程、多处理、OTP、事件处理,以及所有Erlang的重要特性和强大功能。
书是讲述下一代编程语言Erlang 的权威著作,主要涵盖顺序型编程、异常处理、编译和运行代码、并发编程、并发编程中的错误处理、分布式编程、多核编程等内容。本书将帮助读者在消息传递的基础上构建分布式的并发系统...
书是讲述下一代编程语言Erlang 的权威著作,主要涵盖顺序型编程、异常处理、编译和运行代码、并发编程、并发编程中的错误处理、分布式编程、多核编程等内容。本书将帮助读者在消息传递的基础上构建分布式的并发系统...
本书是讲述下一代编程语言Erlang 的权威著作,主要涵盖顺序型编程、异常处理、编译和运行代码、并发编程、并发编程中的错误处理、分布式编程、多核编程等内容。本书将帮助读者在消息传递的基础上构建分布式的并发...
《Erlang程序设计》是讲述下一代编程语言Erlang 的权威著作,主要涵盖顺序型编程、异常处理、编译和运行代码、并发编程、并发编程中的错误处理、分布式编程、多核编程等内容。《Erlang程序设计》将帮助读者在消息...
书是讲述下一代编程语言Erlang 的权威著作,主要涵盖顺序型编程、异常处理、编译和运行代码、并发编程、并发编程中的错误处理、分布式编程、多核编程等内容。本书将帮助读者在消息传递的基础上构建分布式的并发系统...
中的错误 9.附录.B:备份回调函数接口 9.1.Mnesia.备份回调行为 10.附录.C:作业存取回调接口 10.1.Mnnesia.存取回调行为 11.附录.D:分片表哈希回调接口 11.1.mnesia_frag_hash.回调行为
错误处理 构图 套接字类型属性和标识属性 与ZMTP 3.0的向后互操作性 安装 您可以chumak在包含以下内容,从安装rebar.config : { deps ,[ { chumak , " X.Y.Z " } ]}. 其中XYZ是。 有关rebar3依赖项的更多信息,...
当未确认(运行中)的请求数超过可配置的最大值时,将自动开始批量处理生产者:将针对常见错误(例如“不是分区的领导者”)尝试重新发送缓冲的消息,通过刷新元数据自动解决错误简单使用者:轮询器具有可配置的...
阿杰尔 用 C# 实现的类 Erlang 语言。... Erlang 字符串处理 Erlang 有什么不好 JavaScript 中的 Tiny Actor 运行时 。网 阻塞收集和生产者-消费者问题 快速和最佳的生产者/消费者队列技术 BlockingCollect
:: [ ]特征更精细的日志级别(调试,信息,通知,警告,错误,严重,警报,紧急情况) 使用解析转换来转换记录器调用,以允许捕获模块/功能/行/ Pid信息当没有处理程序正在使用日志级别(例如,调试)时,不会将...
这可能是有风险的,因为nif库或sqlite数据库中的错误可能会使整个Erlang VM崩溃。 如果您不想冒险,总是可以从单独的erlang节点访问sqlite nif。 特别注意不要阻塞调用进程的调度程序。 这是通过在轻量级线程中...
erlang-standard-snippets ...从 shell 运行 esnipper 会给出很好的打印错误,要在 shell 中运行,请执行以下操作: { ok , _ } = c ( esnipper , [ debug_info ]), esnipper : main ([ dict , lists ])
Yokozuna进行了修改,以改善错误处理和可见性。 修补程序 将生成的光束复制到basho-patches目录中。 您的平台的basho-patches目录可在以下位置找到: : cp ebin/*.beam /usr/lib64/riak/lib/basho-patches/ 为了...
2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10 2.11 2.12 2.13 2.14 3.1 3.2 3.3 3.4 4.1 4.2 4.3 和Erlang互操作 错误处理 可执⾏⽂件 并发OTP并发 OTP Supervisors OTP 分布式 元编程 Umbrella Projects ...
第7章错误处理 Catch和Throw 进程终止 链接进程 运行时失败 自定义默认的信号接收动作 未定义函数和未注册名称 第8章编写健壮的应用程序 防范错误数据 健壮的服务进程 分离计算部分 保持进程存活 讨论 第...