You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Elixir语言中函数名以!结尾有什么特殊含义

Elixir 中函数名以!结尾的特殊含义

这是Elixir标准库及整个生态统一遵循的命名约定,不属于语法层面的强制规则,但所有主流类库都会遵守这个惯例,核心含义可以总结为:

  • 这类函数是对应同名无!后缀函数的「失败即抛错」版本,执行出错时不会返回表示错误的元组/状态值,而是直接抛出异常终止流程
  • 执行成功时不会用{:ok, result}的格式包裹返回值,会直接返回目标结果本身,省去调用方模式匹配拆包的步骤

拿Application.fetch_env!/2举例,和无!后缀的Application.fetch_env/2行为对比如下:

  1. 当对应配置项存在时:
    • Application.fetch_env(:my_app, :db_host) 返回 {:ok, 配置值}
    • Application.fetch_env!(:my_app, :db_host) 直接返回配置值本身
  2. 当对应配置项不存在时:
    • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 06:01:01