Plug.Exception 如何工作?

luk*_*mas 2 elixir phoenix-framework plug

我\xe2\x80\x99m 在获取一个简单的示例时遇到一些问题。I\xe2\x80\x99m 不使用 Phoenix FWIW,只需插入

\n\n
defmodule Unauthorized do\n  defexception message: "not authorized", plug_status: 401\nend\n\ndefmodule Foo do\n  use Plug.Router\n  plug :match\n  plug :dispatch\n\n  get "/" do\n    send_resp(conn, 200, "heyyyo")\n  end\n\n  get "/boom" do\n    raise Unauthorized\n  end\n\n  match _ do\n    send_resp(conn, 404, "not found")\n  end\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是一个愚蠢的例子,但我\xe2\x80\x99m只是想看看它是否会像我认为的那样工作。

\n\n

我希望 Plug 能够处理引发的异常GET /boom并返回 401 状态

\n\n

但是,当我尝试GET /boom返回 500 状态时,显然异常是由 Plug 处理的 \xe2\x80\x99t

\n

Dog*_*ert 5

use Plug.ErrorHandler如果您想捕获这些异常并根据引发的异常发送 HTTP 状态代码,则需要添加:

defmodule Foo do
  use Plug.Router
  use Plug.ErrorHandler

  ...
end
Run Code Online (Sandbox Code Playgroud)

通过此更改,我得到了正确的响应:

$ curl -i http://localhost:4000/boom
HTTP/1.1 401 Unauthorized
server: Cowboy
date: Wed, 17 May 2017 19:59:57 GMT
content-length: 20
cache-control: max-age=0, private, must-revalidate

Something went wrong
Run Code Online (Sandbox Code Playgroud)