处理Phoenix / Elixir中的错误

时间:2017-11-07 04:51:24

标签: elixir phoenix-framework

1)如何在应用程序级别处理“服务器错误”和“未找到页面” ?我应该在哪里放置一个呈现适当页面的处理程序?

也就是说,如果用户访问“my_website.com/fdafdsafds” - 如何向他呈现“error / my_custom_404_page.html”页面?

或者,如果我的应用程序中某处出现错误,例如“1/0”,我怎样才能在应用程序级别上捕获它?

2)在插头里面我有这个:

  def call(conn, opts) do
    if !some_condition do
      # ....
    else
      # how to render an html template?
      Conn.send_resp(conn, 401, "access denied") |> Conn.halt()
    end
  end

如何从“error / my_html_template.html”渲染自定义错误html模板并将参数传递给它?

2 个答案:

答案 0 :(得分:1)

TL; DR 您要声明自定义异常(使用标准Elixir defexception宏)并为它们实现Plug.Exception协议,如下所示:

defimpl Plug.Exception, for: Ecto.NoResultsError do
  def status(_exception), do: 418
end

然后,一旦提出,它将由此实现处理。

有关如何在Phoenix文档中执行此操作的详细说明。我认为没有理由从那里复制内容,但我必须承认解释非常简单。

答案 1 :(得分:0)

  

1)我如何处理"服务器错误"和"页面未找到"在...上   申请级别?我应该在哪里放置渲染的处理程序   适当的页面?

我使用了以下技巧

scope "/", MyApp do  
  post "/*path",  PageController, :invalid_path  
  put "/*path",  PageController, :invalid_path  
  get "/*path",  PageController, :invalid_path  
end

invalid_path 方法中定义自定义错误消息。

注意:在路由器文件的末尾添加这些行