Erlang基础(三):异常,BIF,比特语法,编译与运行

2015-10-06  本文已影响401人  文卿

开篇

恩,被赤裸裸的打脸了,刚说完每周2更,结果拖到现在都没有一更。。恩。。虽然中间本人完成了人生大事的一部分--订婚。
好了,废话不多说,今天来介绍下 异常,内置函数,二进制数据和所对应的比特语法,以及如何编译和运行程序等等。

异常

try ... of
  Pattern [when guard] -> expression;
  ...other pattern...
catch
  exception type : Pattern [when guard] -> express;
  ...other pattern...
after
  expression;
  ...other expression...
end.
  throw-> 调用者处理的可忽略的异常,
  exit-> 程序退出类型异常,
  erlang:error -> 程序崩溃类型异常
catch expression.

直接捕获表达式中的异常.如 demo 代码中的 test2/0 函数.

  1. 经常会返回错误的程序
  case ... of 
      {ok, Val} -> do_something(Val);
      {error, Why} -> %% do something with error message Why
 end.
  2. 出错几率小的代码
  try ...
  catch
    throw:{thisError, Val} -> ...
    exit:{otherError, Val} ->...
  end.
 3. 捕获所有可能的异常
  try expression
  catch
    _:_ -> ... %% 切记,此处不能写成 _ -> 。如此则捕获不到任何异常.
  end.

BIF

BIF 即 Built in functions,也就是内置函数,或称之为系统函数更为合适些。erlang中的BIF看起来像是函数,其实不然,他是针对于erlang虚拟机的操作指令。如:

@spec time() -> 获取当前时间

@spec lists:reverse(List) -> List. 翻转列表

@spec term_to_binary(Term) -> binary().  将所有erlang的值转换为二进制数据.n

注: @spec 为erlang中的文档标记用法

比特语法

%%解析COFF数据
-define(DWORD, 32/unsigned-little-integer).
-define(LONG, 32/unsigned-little-integer).
-define(WORD, 16/unsigned-little-integer).
-define(BYTE, 8/unsigned-little-integer).
<<Characteristics : ?DWORD,
     TimeDateStamp : ?DWORD,
     MajorVersion : ?WORD,
     MinVersion : ?WORD,
     NumberOfNamedEntries : ?WORD,
     NumberOfIdEntries : ?WORD>>.

上述代码参照COFF的结构体进行二进制数据读取,可见,尤为简单。无需移位,截断等等。

编译运行

运行的方式大致有三种,shell中运行,单文件编译运行,工程编译运行。

io:format("Allen@erlang virtual machine~n").
code:add_pathz(".");

运行结果:


-module (hello).
-export([hi/0]).
-auth(allen).
-date("2015.08.28").
-vsn("1.0.0").
hi () ->
    "Hello World".

执行方式:



也可以在命令行下编译并执行,如:

erlc hello.erl
erl -noshell -s hello hi -s init stop

结果:



当然,还有一种方式则是编写 escript 或者 编写sh脚本运行程序。(使用 -eval 命令)--> 限于篇幅,将在后续IM工程中使用时介绍。

.SUFFIXES: .erl .beam
.erl.beam:
    erlc -W $<
ERL = erl -boot start_clean
MODS=hello
all: compile
    ${ERL} -pa "." -s hello hi
compile: ${MODS:%=%.beam}
clean:
    rm -rf *.beam erl_crash.dump

执行结果如下:


makefile
上一篇 下一篇

猜你喜欢

热点阅读