Elixir 如何在渲染中引发异常

Elixir 如何在渲染中引发异常,elixir,phoenix-framework,Elixir,Phoenix Framework,我的控制器中有以下异常处理程序 def call(conn, opts) do try do super(conn, opts) rescue e in Ecto.CastError -> conn |> put_status(:not_found) |> render(ErrorView, "404.html") e in ArgumentError -> conn |>

我的控制器中有以下异常处理程序

  def call(conn, opts) do
    try do
      super(conn, opts)
    rescue
      e in Ecto.CastError -> conn
      |> put_status(:not_found)
      |> render(ErrorView, "404.html")

      e in ArgumentError -> conn
      |> put_status(:not_found)
      |> render(ErrorView, "404.html")
    end
  end
  defimpl Plug.Exception, for: Ecto.CastError do
    def status(_exception), do: 404
  end
我希望它能提升
404
,而不是
exto.CastError
来提升
400
。但是,我不能满足以下测试条件

  test "renders page not found when id is not all number", %{conn: conn} do
    assert_error_sent 404, fn ->
      get conn, url_path(conn, :show, "sdf2sd")
    end
  end
因为我的自定义异常处理程序没有引发异常


问题是,如何在我自己的自定义异常处理程序中引发适当的异常以满足测试要求?

请查看本页,了解如何在Phoenix中处理错误:


您可能可以覆盖默认值(已定义),从而使exto.CastError产生404。

我使用了错误的方法,而不是

  def call(conn, opts) do
    try do
      super(conn, opts)
    rescue
      e in Ecto.CastError -> conn
      |> put_status(:not_found)
      |> render(ErrorView, "404.html")

      e in ArgumentError -> conn
      |> put_status(:not_found)
      |> render(ErrorView, "404.html")
    end
  end
我应该在控制器中使用此块

  def call(conn, opts) do
    try do
      super(conn, opts)
    rescue
      e in Ecto.CastError -> conn
      |> put_status(:not_found)
      |> render(ErrorView, "404.html")

      e in ArgumentError -> conn
      |> put_status(:not_found)
      |> render(ErrorView, "404.html")
    end
  end
  defimpl Plug.Exception, for: Ecto.CastError do
    def status(_exception), do: 404
  end

谢谢你,帮我找到了我做错的地方。虽然要回答我的问题,这条线索还不够:)