Как работает Plug.Exception?
У меня возникли проблемы с получением простого примера для работы. Я не использую 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, так что, очевидно, исключение не обрабатывается Plug
1 ответ
Решение
Вам нужно добавить use Plug.ErrorHandler
если вы хотите перехватить эти исключения и отправить код состояния HTTP на основе возникшего исключения:
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