Как работает 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
Другие вопросы по тегам