Elixir语言中函数名以!结尾有什么特殊含义
Elixir 中函数名以
!结尾的特殊含义 这是Elixir标准库及整个生态统一遵循的命名约定,不属于语法层面的强制规则,但所有主流类库都会遵守这个惯例,核心含义可以总结为:
- 这类函数是对应同名无
!后缀函数的「失败即抛错」版本,执行出错时不会返回表示错误的元组/状态值,而是直接抛出异常终止流程 - 执行成功时不会用
{:ok, result}的格式包裹返回值,会直接返回目标结果本身,省去调用方模式匹配拆包的步骤
拿Application.fetch_env!/2举例,和无!后缀的Application.fetch_env/2行为对比如下:
- 当对应配置项存在时:
Application.fetch_env(:my_app, :db_host)返回{:ok, 配置值}Application.fetch_env!(:my_app, :db_host)直接返回配置值本身
- 当对应配置项不存在时:
Application.fetch_env(:my_app, :db_host)返回:error,需要调用方自行处理缺配置的逻辑Application.fetch_env!(:my_app, :db_host)直接抛出ArgumentError异常,不会继续向后执行
给出的示例代码就是这个约定的典型适用场景:
defp db_host do Application.fetch_env!(:my_app, :db_host) end
数据库连接地址是服务启动的必填配置,如果这个值缺失,服务本身就无法正常运行,用!后缀的函数可以实现快速失败,第一时间暴露配置缺失的问题,避免错误状态传递到后续数据库连接环节才触发更难排查的问题。
除了应用配置读取函数外,Elixir标准库中大量函数都遵循这个约定,比如Map.fetch!/2、File.read!/1、Keyword.fetch!/2等,行为逻辑完全一致:成功直接返回目标值,失败直接抛错。
内容的提问来源于stack exchange,提问作者Chen Yu
相关产品推荐
相关产品推荐

