`
litaocheng
  • 浏览: 337739 次
  • 性别: 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中文基础教程

    4. **容错性**:Erlang的错误处理机制鼓励“let it crash”理念,即当一个进程出错时,它会自动崩溃,其他进程不受影响,从而实现系统的自我修复。 5. **分布式**:Erlang天生支持分布式计算,可以轻松地在多台机器...

    erlang 中文基础教程

    更复杂的数学运算也能轻松处理,比如`(42+77)*66/3.`,Erlang Shell能够正确解析并执行加、减、乘、除等运算,返回结果`2618.00`。这展示了Erlang语言强大的计算能力。 当需要退出Erlang Shell时,可以通过两种方式...

    erlang编程 Introducing Erlang

    它包括行为(如GenServer、GenEvent和Supervisor)、应用和系统结构的指导原则,以及错误处理机制。 ### 4. 链接与监控 Erlang中的链接(Linking)和监控(Monitoring)机制允许进程间建立关系,以便在另一进程...

    Erlang游戏程序学习完整PDF手册

    4. **简单错误处理**:Erlang的错误处理机制鼓励“失败快速”,即尽早发现并处理错误,而不是隐藏它们,这样有利于编写出更健壮的代码。 5. **模式匹配**:Erlang的模式匹配功能使得数据处理更加简洁高效,对于游戏...

    Erlang中文手册.pdf

    - **1.1.2 其它方面**:文档省略了关于Erlang的许多高级主题,包括本地错误处理、单向连接、二进制数据处理、哈希表、运行时代码修改等。 #### 1.2 顺序编程 - **1.2.1 Erlang Shell**:Erlang提供了一个交互式的...

    erlang中dns解析

    Erlang提供了丰富的错误处理机制,通过捕获异常或检查返回值,可以适当地处理这些情况。 7. **性能优化**:Erlang的轻量级进程和高效的消息传递机制使其在处理大量并发DNS请求时表现出色。通过缓存最近的查询结果,...

    erlang 中文,chm参考文档

    这两个文件将帮助你全面理解Erlang的基础语法、并发模型、错误处理机制以及高级特性。 Erlang手册(5.8.2).chm是官方文档的中文版,涵盖了Erlang的版本5.8.2的所有内容。这个文档通常包含以下部分: 1. **基础**...

    erlang资源

    3. **错误处理与容错**:Erlang推崇“let it crash”哲学,鼓励程序在遇到错误时快速失败并重启,而不是尝试修复。书里可能会讨论如何构建健壮的系统,利用Erlang的故障隔离特性。 4. **分布式编程**:Erlang进程...

    xiandiao_erlang_Erlang课后习题_

    4. **错误处理与恢复**:习题可能设计为在遇到错误时,系统能优雅地处理并恢复,让学习者理解Erlang中的错误处理策略。 5. **模块化编程**:Erlang的模块系统可以帮助组织代码,习题可能要求学习者将功能分解到多个...

    erlang 中进程

    OTP的错误处理机制允许系统优雅地处理错误,恢复到稳定状态。Supervisors可以配置为简单的一次重启、有限次数的重启或停止整个子树,从而避免无限循环的错误。 7. 分布式特性 Erlang的进程模型不仅适用于单节点系统...

    Erlang_CNode用户指

    5. **错误处理和调试**:讨论在CNode中处理Erlang错误和异常的方法,以及如何利用Erlang的调试工具来排查问题。 6. **性能优化**:提供关于如何最大限度地提高CNode与Erlang节点之间通信效率的提示和最佳实践。 7....

    Programming Erlang

    除此之外,书中还会涉及错误处理和测试策略,帮助开发者编写健壮的Erlang代码。Erlang的错误处理机制鼓励“let it crash”哲学,即快速失败并恢复,以保持系统的整体稳定性。 最后,书中包含了一些实际项目案例,如...

    erlang 中文乱码

    当我们在处理中文字符时,特别是在Erlang环境中,可能会遇到“中文乱码”的问题。这个问题通常与字符编码、文件读写以及系统配置有关。下面我们将详细探讨这个问题以及如何解决。 首先,我们需要理解Erlang中的字符...

    erlang25.0 windows版本

    - **OTP(Open Telephony Platform)**:Erlang的核心库,包含大量预先设计的模块,用于处理常见的系统任务,如错误处理、分布式计算和监控。 - **行为模式**:如GenServer、GenEvent和Gen_fsm,它们定义了Erlang中...

    erlang_版本24.3.4.4

    - **错误处理**:Erlang采用异常处理机制,鼓励编写无副作用的纯函数,有助于编写容错性强的代码。 - **模式匹配**:Erlang的模式匹配功能允许在函数定义中使用模式来匹配和解构数据结构,简化了代码编写。 - **...

    erlang nif test

    - **错误传播**:Erlang的错误处理机制与C不同,所以要确保在C代码中遇到错误时,能够正确地将错误信息转换为Erlang术语并返回。 - **性能优化**:虽然NIF可以提高性能,但过多或不适当的使用可能会导致内存碎片和...

    图书:Erlang编程

    这本书将帮助读者理解Erlang的核心概念,包括过程、模式匹配、轻量级进程以及错误处理机制。 首先,Erlang中的“过程”是其并发模型的基础,每个过程都是独立的执行单元,它们之间通过消息传递进行通信。这种设计...

    rustler编写erlang nif

    - 它自动处理内存管理和错误处理,使得Rust与Erlang之间的交互更加安全和方便。 3. **Rustler工作流程**: - 创建一个新的Rust项目,添加必要的依赖,包括`rustler`库。 - 在Rust代码中定义NIF函数,遵循Rustler...

    Erlang中文手册

    **错误处理与容错性** Erlang强调在设计时就考虑错误情况,采用“let it crash”原则。当一个进程崩溃时,其他进程不会受到影响,而是通过监控和链接机制来处理异常,从而实现系统的健壮性。这种理念使得Erlang在...

    erlang英文手册+中文教程

    **错误处理与容错机制** Erlang采用"Let it crash"的设计哲学,鼓励程序在遇到错误时快速失败,而不是尝试掩盖错误。通过这种方式,系统能够更快地检测到问题,并通过自我修复机制恢复服务,增强了系统的健壮性和...

Global site tag (gtag.js) - Google Analytics