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

如何在Elixir中将Erlang错误信息转换为用户友好文本

Converting Elixir File Error Atoms to User-Friendly Messages

Great question! Those Erlang-style error atoms like :enoent are super handy for developers, but they’re definitely not ideal for end users. Luckily, Elixir gives you several straightforward ways to translate them into readable, friendly text:

1. Manual Pattern Matching (Direct & Explicit)

The simplest approach is to match on specific error atoms and return custom messages tailored to your use case. This gives you full control over the tone and wording:

case File.read("no_existant_file.csv") do
  {:ok, content} -> content  # Handle successful read
  {:error, :enoent} -> "Oops! The file you're looking for doesn't exist. Please double-check the filename and try again."
  {:error, :eacces} -> "Sorry, we don't have permission to access that file. Make sure it's not locked or restricted."
  {:error, reason} -> "Whoops, we ran into an unexpected issue: #{inspect(reason)}"  # Catch-all for other errors
end

2. Use Erlang's :file.format_error/1 (Quick & Built-In)

Erlang’s :file module has a handy function that converts error atoms to standard human-readable strings. Elixir can call this directly—no extra setup needed:

case File.read("no_existant_file.csv") do
  {:ok, content} -> content
  {:error, reason} -> 
    error_text = :file.format_error(reason)
    "File error: #{error_text}"
end

For :enoent, this will return No such file or directory—it works for most common file-related errors like :eacces (permission denied) or :eisdir (is a directory) out of the box.

3. Custom Error Mapping Module (Scalable & Reusable)

If you want consistent messages across your app, wrap the logic in a custom module. This makes it easy to update messages or add new error cases later:

defmodule FileErrorMessages do
  @friendly_messages %{
    :enoent => "Whoops! That file doesn’t seem to exist. Double-check the name and path, okay?",
    :eacces => "Hmm, we can’t access that file. Make sure it’s not locked or you have the right permissions.",
    :eisdir => "Wait, that’s a folder, not a file! Please select a valid file instead."
  }

  def get_friendly_message(reason) do
    Map.get(@friendly_messages, reason, "Sorry, we hit an unexpected error: #{inspect(reason)}")
  end
end

# Usage example
case File.read("no_existant_file.csv") do
  {:ok, content} -> content
  {:error, reason} -> FileErrorMessages.get_friendly_message(reason)
end

Bonus Tip

If you’re building a web app (like with Phoenix), you can even integrate these messages with internationalization tools to support multiple languages—just map the error atoms to translated strings instead!

内容的提问来源于stack exchange,提问作者RobStallion

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:59:50