我在找一个简单的例子工作时遇到了一些麻烦。我没有使用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状态,所以显然插件没有处理异常
答案 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