2016-11-27 90 views
2

我想区分“找不到页面”和“找不到资源”错误。 是否有可能获得异常类型来做类似下面的事情?菲尼克斯错误处理

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

你说得对;您匹配的模式不正确。要将结构的结构类型与case(并忽略该结构的任何字段的值)相匹配,需要在结构的模块名称之后使用%之前和{}。您还应该在case之外执行任务以防止Elixir的“不安全变量”警告。我也切换到了函数头的模式匹配,而不是使用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 

有了这个代码,我得到如下结果:

$ curl -H 'Accept: application/json' http://localhost:4000/404 
{"error":"Route not found"} 
$ curl -H 'Accept: application/json' http://localhost:4000/api/contacts/1 
{"error":"Resource not found"} 
相关问题