首页 > 其他分享 >无涯教程-Erlang - 异常处理

无涯教程-Erlang - 异常处理

时间:2023-12-03 15:33:02浏览次数:38  
标签:教程 caught exception 无涯 try catch Erlang generate 表达式

任何编程语言都需要异常处理来处理运行时错误,以便可以维护应用程序的正常流程。

通常,当Erlang中发生异常或错误时,将显示以下消息。

{"init terminating in do_boot", {undef,[{helloLearnfk,start,[],[]}, 
{init,start_it,1,[]},{init,start_em,1,[]}]}}

故障转储将被写入-

erl_crash.dump
init terminating in do_boot ()

在Erlang中,有3种异常类型-

  • Error    -  调用 erlang:error(Reason)将结束当前进程的执行,并包括最后一个函数的堆栈跟踪以及其参数。

  • Exists   -  "internal"和"external",internal退出通过调用函数 exit/1 触发,并使当前进程停止执行。external使用 exit/2 调用,并且与Erlang并发方面的多个进程有关。

  • Throw  -  抛出是一类异常,用于可以期望程序员处理的情况。

try catch表达式的一般语法如下。

try Expression of 
SuccessfulPattern1 [Guards] -> 
Expression1; 
SuccessfulPattern2 [Guards] -> 
Expression2 

catch 
TypeOfError:ExceptionPattern1 -> 
Expression3; 
TypeOfError:ExceptionPattern2 -> 
Expression4 
end

在 try和of 之间的表达式被认为是保护,这意味着该调用中发生的任何异常都将被捕获, try和catch 之间的模式和表达式的行为与 case ... of 完全相同。

以下是Erlang中的一些错误和错误原因-

错误 错误类型
badarg 错误的论点。该参数的数据类型错误,或格式错误。
badarith 算术表达式中的错误参数。
{badmatch,V} 匹配表达式的计算失败。值V不匹配。
function_clause 判断函数调用时找不到匹配的函数子句。
{case_clause,V} 在计算case表达式时找不到匹配的分支。值V不匹配。
if_clause 在判断if表达式时找不到真正的分支。
{try_clause,V} 在判断try表达式的of-section时,找不到匹配的分支。值V不匹配。
undef 判断函数调用时找不到该函数。
{badfun,F} 有趣的F出了点问题
{badarity,F} 错误的参数数量会带来乐趣。 F描述了乐趣和参数。
timeout_value receive..after表达式中的超时值被计算为非整数或无穷大。
noproc 尝试链接到不存在的进程。

-module(helloLearnfk). -compile(export_all). generate_exception(1) -> a; generate_exception(2) -> throw(a); generate_exception(3) -> exit(a); generate_exception(4) -> {'EXIT', a}; generate_exception(5) -> erlang:error(a). demo1() -> [catcher(I) || I <- [1,2,3,4,5]]. catcher(N) -> try generate_exception(N) of Val -> {N, normal, Val} catch throw:X -> {N, caught, thrown, X}; exit:X -> {N, caught, exited, X}; error:X -> {N, caught, error, X} end. demo2() -> [{I, (catch generate_exception(I))} || I <- [1,2,3,4,5]]. demo3() -> try generate_exception(5) catch error:X -> {X, erlang:get_stacktrace()} end. lookup(N) -> case(N) of 1 -> {'EXIT', a}; 2 -> exit(a) end.

如果我们以helloLearnfk:demo()的身份运行程序。 我们将获得以下输出-

[{1,normal,a},
{2,caught,thrown,a},
{3,caught,exited,a},
{4,normal,{'EXIT',a}},
{5,caught,error,a}]

参考链接

https://www.learnfk.com/erlang/erlang-exceptions.html

标签:教程,caught,exception,无涯,try,catch,Erlang,generate,表达式
From: https://blog.51cto.com/u_14033984/8668205

相关文章

  • 初中生就能看懂的Python教程 - 1. hello world、print与对象类型
    上一篇教程我们讲了如何安装Python。可以开始编程了。这一篇文章讲解有关print与变量的内容。不过我没讲怎么使用IDLE。在这里补充一下。PythonIDLE的使用下载完Python之后我们应该可以在开始菜单找到一个程序叫做IDLE,这也是新手最常用的Python编辑器,Python自带的。打开IDLE......
  • 无涯教程-Erlang - Records(记录)
    Erlang具有创建records记录函数,这些records记录由字段组成,例如,您可以定义一个personal records,其中包含2个字段,一个是id,另一个是name字段。然后,您可以在Erlang中创建此records记录的各种实例,以定义具有不同名称和ID的多个personal。创建记录使用record标识符创建,在此record......
  • 无涯教程-Erlang - Maps(映射)
    Maps中的每个键-值(key-value)关联称为关联对,该对中的键和值部分称为元素,关联对的数量被称为Map的大小。我们定义了具有2个Maps的MapM1,map_size是用Erlang定义的内置函数,可用于查看Map的大小。-module(helloLearnfk).-export([start/0]).start()->M1=#{name=>john......
  • 无涯教程-Erlang - 文件I/O
    使用I/O时,Erlang提供了许多方法。它具有更简单的类,可为文件提供以下函数-读取文件写入文件查看文件是文件还是目录让我们探讨一下Erlang提供的一些文件操作,出于这些示例的目的,我们将假设有一个名为NewFile.txt的文件,其中包含以下文本行Example1Example2Example3在以下......
  • 无涯教程-Erlang - Strings(字符串)
    通过将字符串括在引号中,可以在Erlang中构造一个字符串文字,需要使用双引号(如"HelloLearnfk")构造Erlang中的字符串。-module(helloLearnfk).-export([start/0]).start()->Str1="Thisisastring",io:fwrite("~p~n",[Str1]).上面程序的输出将是-“Thisisa......
  • Windows 下安装和配置 Redis (图文教程)
    ......
  • 无涯教程-Erlang - Lists(列表)
    列表是用于存储数据项集合的结构,在Erlang中,列表是通过将值括在方括号中来创建的。-module(helloLearnfk).-export([start/0]).start()->Lst1=[1,2,3],io:fwrite("~w~n",[Lst1]).上面示例的输出将是-[123]现在让我们讨论可用于列表的各种方法。Sr.No方法......
  • 无涯教程-Erlang - Numbers(数字)
    在Erlang中,有两种数字类型:整数(integers)和浮点数(floats)。整数示例:-module(helloLearnfk).-export([start/0]).start()->io:fwrite("~w",[1+1]).上面程序的输出如下:2浮点数示例:-module(helloLearnfk).-export([start/0]).start()->io:fwrite("~......
  • VMware安装教程
    一、安装VMware前准备需要先安装VMware安装包和centos的镜像VMware下载网址:https://customerconnect.vmware.com/cn/downloads/info/slug/desktop_end_user_computing/vmware_workstation_pro/16_0Centos镜像下载网址: Indexof/centos/7.9.2009/isos/x86_64/|清华大学......
  • 无涯教程-Erlang - 递归
    递归是Erlang的重要组成部分,首先,让我们看看如何通过实现阶乘程序来实现简单的递归。-module(helloLearnfk).-export([fac/1,start/0]).fac(N)whenN==0->1;fac(N)whenN>0->N*fac(N-1).start()->X=fac(4),io:fwrite("~w",[X]).关于上述程序,需要......