【问题标题】:Handling error in Phoenix/ElixirPhoenix/Elixir 中的处理错误
【发布时间】:2017-11-07 14:53:07
【问题描述】:

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 模板并将参数传递给它?

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案1】:

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

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

    然后,一旦引发,它将由此实现处理。


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

    【讨论】:

    • 这只是 1) 2) 怎么样?
    • 不,这回答了两个问题:从您的Plug 中抛出一个自定义异常,而不是明确的Conn.halt()
    • 与渲染错误模板相比,抛出异常的成本更高。有没有办法呈现错误模板?
    • 另外,如何将这个def render("404.html", _assigns) do 重新定义为def render("404_not_found.html", _assigns) do 之类的东西?对我来说,“404”没有任何意义,但“404_not_found”——确实如此。
    • “与呈现错误模板相比,抛出异常的成本更高”——你有任何证据吗?另外,如果你想渲染,就用render(conn, "template.html")渲染它。
    【解决方案2】:

    1) 如何处理“服务器错误”和“找不到页面” 应用层?我应该把渲染的处理程序放在哪里 合适的页面?

    我使用了以下技巧

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

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

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

    【讨论】:

    • 请不要这样做;检查我的答案,它包含指向 Phoenix 文档的链接,其中详细说明了如何以正确的方式执行此操作。
    • 这是一个不好的模式,不应该使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多