Plug.Exception如何工作?

时间:2017-05-17 19:37:58

标签: elixir phoenix-framework plug

我在找一个简单的例子工作时遇到了一些麻烦。我没有使用Phoenix FWIW,只需插上

即可
defmodule Unauthorized do
  defexception message: "not authorized", plug_status: 401
end

defmodule Foo do
  use Plug.Router
  plug :match
  plug :dispatch

  get "/" do
    send_resp(conn, 200, "heyyyo")
  end

  get "/boom" do
    raise Unauthorized
  end

  match _ do
    send_resp(conn, 404, "not found")
  end
end

这是一个愚蠢的例子,但我只是想看看它是否会像我认为的那样有效。

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

然而,当我尝试GET /boom时,它返回500状态,所以显然插件没有处理异常

1 个答案:

答案 0 :(得分:2)

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

defmodule Foo do
  use Plug.Router
  use Plug.ErrorHandler

  ...
end

通过此更改,我得到了正确的答案:

$ 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