elixir 的异常融合了 ruby 的东西, 很多人容易搞错, 这里总结一下
基础知识: erlang 异常类型有三种, throw, error 和 exit
raise + rescue
raise 字符串就是 RuntimeError 类型
1 | > try do |
raise 原子被认为是模块名会报错
1 | > try do |
rescue 可以拦截到 erlang error 类型
1 | > try do |
raise rescue 这两关键字是从 ruby 里来的, 还允许自定义 Error 类型以及扩展字段
1 | > try do |
rescue 拦截不到 throw 类型的异常
1 | > try do |
rescue 也拦截不住 exit 类型的异常
1 | > try do |
即 rescue 只能拦截 error 类型的异常
catch
catch 一个参数的形式只能拦截 throw 类型的异常, error 和 exit 都拦截不住
官方建议 throw 仅用于流控, 也就是在一个内部函数里抛一个值出来, 相当于命令式语言里的 return
1 | > try do |
catch 两个参数的形式可以拦截 throw, error 和 exit 类型的异常, 全能
1 |
|
Enjoy!