`
litaocheng
  • 浏览: 333381 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

erlang中的错误处理

阅读更多
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 深入底层: erlang VM基于多核处理器的可伸缩性特征 erlang VM内部数据共享机制 erlang ...

    Erlang趣学指南

    (494页带目录的高清扫描版) 这是一本讲解Erlang编程语言的入门指南,内容通俗...内容涉及模块、函数、类型、递归、错误和异常、常用数据结构、并行编程、多处理、OTP、事件处理,以及所有Erlang的重要特性和强大功能。

    Erlang程序设计【高清扫描版】【完整书签】

    书是讲述下一代编程语言Erlang 的权威著作,主要涵盖顺序型编程、异常处理、编译和运行代码、并发编程、并发编程中的错误处理、分布式编程、多核编程等内容。本书将帮助读者在消息传递的基础上构建分布式的并发系统...

    Erlang程序设计中文版(完整书签)

    书是讲述下一代编程语言Erlang 的权威著作,主要涵盖顺序型编程、异常处理、编译和运行代码、并发编程、并发编程中的错误处理、分布式编程、多核编程等内容。本书将帮助读者在消息传递的基础上构建分布式的并发系统...

    Erlang程序设计

    本书是讲述下一代编程语言Erlang 的权威著作,主要涵盖顺序型编程、异常处理、编译和运行代码、并发编程、并发编程中的错误处理、分布式编程、多核编程等内容。本书将帮助读者在消息传递的基础上构建分布式的并发...

    Erlang程序设计中文版和英文原版

    《Erlang程序设计》是讲述下一代编程语言Erlang 的权威著作,主要涵盖顺序型编程、异常处理、编译和运行代码、并发编程、并发编程中的错误处理、分布式编程、多核编程等内容。《Erlang程序设计》将帮助读者在消息...

    ErlangOTP并发编程实战(高清PDF版)

    书是讲述下一代编程语言Erlang 的权威著作,主要涵盖顺序型编程、异常处理、编译和运行代码、并发编程、并发编程中的错误处理、分布式编程、多核编程等内容。本书将帮助读者在消息传递的基础上构建分布式的并发系统...

    erlang——Mnesia用户手册.pdf

    中的错误 9.附录.B:备份回调函数接口 9.1.Mnesia.备份回调行为 10.附录.C:作业存取回调接口 10.1.Mnnesia.存取回调行为 11.附录.D:分片表哈希回调接口 11.1.mnesia_frag_hash.回调行为

    chumak:ZeroMQ消息传输协议的纯Erlang实现

    错误处理 构图 套接字类型属性和标识属性 与ZMTP 3.0的向后互操作性 安装 您可以chumak在包含以下内容,从安装rebar.config : { deps ,[ { chumak , " X.Y.Z " } ]}. 其中XYZ是。 有关rebar3依赖项的更多信息,...

    brod:适用于ErlangElixir的Apache Kafka客户端库

    当未确认(运行中)的请求数超过可配置的最大值时,将自动开始批量处理生产者:将针对常见错误(例如“不是分区的领导者”)尝试重新发送缓冲的消息,通过刷新元数据自动解决错误简单使用者:轮询器具有可配置的...

    AjErl:用 C# 编写的类似 Erlang 的语言解释器

    阿杰尔 用 C# 实现的类 Erlang 语言。... Erlang 字符串处理 Erlang 有什么不好 JavaScript 中的 Tiny Actor 运行时 。网 阻塞收集和生产者-消费者问题 快速和最佳的生产者/消费者队列技术 BlockingCollect

    更大的:ErlangOTP的日志记录框架

    :: [ ]特征更精细的日志级别(调试,信息,通知,警告,错误,严重,警报,紧急情况) 使用解析转换来转换记录器调用,以允许捕获模块/功能/行/ Pid信息当没有处理程序正在使用日志级别(例如,调试)时,不会将...

    esqlite:sqlite的Erlang NIF

    这可能是有风险的,因为nif库或sqlite数据库中的错误可能会使整个Erlang VM崩溃。 如果您不想冒险,总是可以从单独的erlang节点访问sqlite nif。 特别注意不要阻塞调用进程的调度程序。 这是通过在轻量级线程中...

    erlang_standard_snippets:erlang 标准库函数的 Sublime Text 片段

    erlang-standard-snippets ...从 shell 运行 esnipper 会给出很好的打印错误,要在 shell 中运行,请执行以下操作: { ok , _ } = c ( esnipper , [ debug_info ]), esnipper : main ([ dict , lists ])

    yokozuna_error_patch:横须贺修改以改善错误处理和可见性

    Yokozuna进行了修改,以改善错误处理和可见性。 修补程序 将生成的光束复制到basho-patches目录中。 您的平台的basho-patches目录可在以下位置找到: : cp ebin/*.beam /usr/lib64/riak/lib/basho-patches/ 为了...

    Elixir程序设计语言.pdf

    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 ...

    cpie-cn_r148.pdf

    第7章错误处理 Catch和Throw 进程终止 链接进程 运行时失败 自定义默认的信号接收动作 未定义函数和未注册名称 第8章编写健壮的应用程序 防范错误数据 健壮的服务进程 分离计算部分 保持进程存活 讨论 第...

Global site tag (gtag.js) - Google Analytics