Plug.Exception 是如何运作的?
How does Plug.Exception work?
我在使用一个简单的示例时遇到了一些问题。我用的不是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
和 return 401 状态中引发的异常
但是,当我尝试 GET /boom
时,它是 return 500 状态,所以显然 Plug
没有处理异常
如果要捕获这些异常并根据引发的异常发送 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
我在使用一个简单的示例时遇到了一些问题。我用的不是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
和 return 401 状态中引发的异常
但是,当我尝试 GET /boom
时,它是 return 500 状态,所以显然 Plug
如果要捕获这些异常并根据引发的异常发送 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