• Erlang运行中的错误


    Erlang运行时发生错误时,会返回一些错误信息,理解这些信息,对于学好、用好Erlang来说是必要。

    Erlang中的运行错误包括:badarg, badarith, badmatch, function_clause, case_clause, if_clause, undef, noproc, system_limit等。

    badarg

    这个错误很好理解,参数类型错误,传入函数的参数和函数声明要求的参数类型不匹配。

    badarith

    arith,atithmetic的简写,运算错误,例如将一个整数和一个atom相加。

    {badmatch, V}

    模式匹配错误

    function_clause

    从字面意思上看,是函数条款的错误。该错误信息表示找不到匹配的函数。例如,定义一个函数test:add/2,接收两个整数,并返回它们的和。如果传入小数,将找不到匹配的分支,会抛出function_clause。

    {case_clause, V}

    case表达式找不到匹配的分支。一般要把“_”加到最后的分支中,作为容错或者其它。

    if_clause

    Erlang中if表达式是case表达式的一种特殊方式,要求至少有一个分支测试条件的结果为true,否则会引发错误。

    undef

    调用未定义的函数或者模块时,返回该错误信息。

    noproc

    进程不存在,例如gen_server:call一个不存在的进程。

      Pid = pid(0, 100, 10).
      gen_server:call(Pid, test).
      ** exception exit: {noproc,{gen_server,call,[<0.100.10>,test]}}
         in function  gen_server:call/2 (gen_server.erl, line 182)
    

    system_limit

    超出系统上限,如atometsportprocess等。

    ps: 因为在Erlang运行环境中,atom不参与垃圾回收,并且有个数上限,所以使用atom时要谨慎一些

    异常处理

    在开发中可使用try,catch捕获异常,同时也可以调用erlang:get_stacktrace()获取栈信息,定位错误。

      try:
        exprs
      catch
        Class:Reason ->
        %% 异常处理代码
        %% Class为异常类型,Reason为异常原因
        ok
      end.
    

    例如:

      try:
        whatever
      catch
        Class:Reason ->
          io:format("Class:~p, Reason:~p~nstacktrace:~n~p",
                    [Class, Reason, erlang:get_stacktrace()]),
          error
        end.
    
  • 相关阅读:
    Vim自动补全神器YouCompleteMe的配置
    sudo apt-get update 时出现的hit、ign、get的含义
    C语言可变参数宏及‘##’在可变参数中的作用
    搬书游戏
    程序中数字取反结果公式
    利用宏定义中的##实现函数模板的作用
    C中的空宏定义,即只有一个参数
    浏览器缓存技术介绍
    Vue相关原理以及手写一个MyVue
    详解JS中的prototype、__proto__与constructor(图解)
  • 原文地址:https://www.cnblogs.com/xianzhedeyu/p/5624316.html
Copyright © 2020-2023  润新知