Phoenix中的错误处理

时间:2016-11-27 15:39:40

标签: elixir phoenix-framework

我想区分"找不到页面"和"资源未找到"错误。 是否可以让异常类型执行以下操作?

def render("404.json", assigns) do
  case assigns[:reason] do
    NoRouteErro -> message = "Route not found"
    Ecto.NoResultsError -> message = "Resource not found"
    _ -> message = "Uncaught exception"
  end
  ContactService.ResponseHelper.error(message)
end

1 个答案:

答案 0 :(得分:3)

你几乎是对的;你匹配的模式不正确。要使结构的结构类型与TextView匹配(并忽略结构的任何字段的值),您需要在结构的模块名称之后使用case之前和%。您还应该在{}之外进行分配,以防止Elixir的“不安全变量”警告。我还在功能头中切换到模式匹配,而不是使用case

最终代码:

assigns[:reason]

使用此代码,我得到以下结果:

def render("404.json", %{reason: reason}) do
  message = case reason do
    %Phoenix.Router.NoRouteError{} -> "Route not found"
    %Ecto.NoResultsError{} -> "Resource not found"
    _ -> "Uncaught exception"
  end
  # ContactService.ResponseHelper.error(message)
  %{error: message}
end